【问题标题】:Memory usage doesn't increase when allocating memory分配内存时内存使用量不会增加
【发布时间】:2018-08-20 20:32:24
【问题描述】:

我想通过检查操作系统的内存信息来了解 C++ 程序中进程使用的字节数。我想这样做的原因是在分配内存时发现内存分配中可能存在的开销(由于空闲列表中的内存控制块/节点等)。目前我在 mac 上并正在使用此代码:

#include <mach/mach.h>
#include <iostream>

int getResidentMemoryUsage() {
    task_basic_info t_info;
    mach_msg_type_number_t t_info_count = TASK_BASIC_INFO_COUNT;

    if (task_info(mach_task_self(), TASK_BASIC_INFO,
reinterpret_cast<task_info_t>(&t_info),
                  &t_info_count) == KERN_SUCCESS) {

        return t_info.resident_size;
    }
    return -1;
}


int getVirtualMemoryUsage() {
    task_basic_info t_info;
    mach_msg_type_number_t t_info_count = TASK_BASIC_INFO_COUNT;

    if (task_info(mach_task_self(), TASK_BASIC_INFO,
reinterpret_cast<task_info_t>(&t_info),
                  &t_info_count) == KERN_SUCCESS) {

        return t_info.virtual_size;
    }
    return -1;
}

int main(void) {
  int virtualMemoryBefore = getVirtualMemoryUsage();
  int residentMemoryBefore = getResidentMemoryUsage();

  int* a = new int(5);

  int virtualMemoryAfter = getVirtualMemoryUsage();
  int residentMemoryAfter = getResidentMemoryUsage();

  std::cout << virtualMemoryBefore << " " << virtualMemoryAfter << std::endl;
  std::cout << residentMemoryBefore << " " << residentMemoryAfter << std::endl;

  return 0;
}

运行此代码时,我希望看到分配 int 后内存使用量增加了。但是,当我运行上面的代码时,我得到以下输出:

75190272 75190272
819200 819200

我有几个问题,因为这个输出没有任何意义。

  1. 为什么在分配整数后虚拟/常驻内存都没有改变?

  2. 操作系统为什么要为正在运行的进程分配如此大量的内存。

当我运行代码并检查活动监视器时,我发现使用了 304 kb 的内存,但该数字与以编程方式获得的虚拟/常驻内存使用情况不同。

  1. 我的最终目标是能够在分配数据时找到内存开销,那么有没有办法做到这一点(即确定操作系统使用的字节并与分配的字节进行比较以找出不同之处就是我目前正在考虑)

感谢您的阅读

【问题讨论】:

  • 您的操作系统分配给进程的内存不是测量程序请求的内存的好工具。
  • int 可能适合已分配的页面。尝试更大的分配。
  • 请注意,这些数字都是 1024 的整数倍。
  • @FrançoisAndrieux 如果int只有4个字节,一个页面是4kb,有没有办法查询当前进程在单个页面中使用的数据量?
  • 如果您从不写入分配的内存,则操作系统可能永远不会使用物理页面支持分配(因为在您写入之前不需要)。

标签: c++ macos memory ram


【解决方案1】:

C++ 运行时通常会在程序启动时分配一块内存,然后在您使用 new 之类的东西时将其打包到您的代码中,并在您调用 delete 时将其添加回该块中。因此,操作系统对单独的newdelete 调用一无所知。对于 C(或 C++)中的 mallocfree 也是如此

【讨论】:

  • 如果 C++ 运行时分配大块内存并像池分配器一样将其分块,是否有任何方法可以确定存储有关分配的元数据时丢失的字节数?
  • @Raees 仅当您的实现提供这样的东西时,它几乎肯定不会。或者,如果您有分配器的源代码。
【解决方案2】:

首先您测量页数,而不是实际分配的内存。其次,运行时在启动时预分配几个页面。如果您想观察某些东西,请分配多个 int。尝试分配数千个,您会观察到一些变化。

【讨论】:

    猜你喜欢
    • 2019-02-09
    • 2014-11-13
    • 2012-01-24
    • 1970-01-01
    • 1970-01-01
    • 2017-09-17
    • 1970-01-01
    • 2016-01-09
    • 2021-04-15
    相关资源
    最近更新 更多