【发布时间】: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
我有几个问题,因为这个输出没有任何意义。
为什么在分配整数后虚拟/常驻内存都没有改变?
操作系统为什么要为正在运行的进程分配如此大量的内存。
当我运行代码并检查活动监视器时,我发现使用了 304 kb 的内存,但该数字与以编程方式获得的虚拟/常驻内存使用情况不同。
- 我的最终目标是能够在分配数据时找到内存开销,那么有没有办法做到这一点(即确定操作系统使用的字节并与分配的字节进行比较以找出不同之处就是我目前正在考虑)
感谢您的阅读
【问题讨论】:
-
您的操作系统分配给进程的内存不是测量程序请求的内存的好工具。
-
int可能适合已分配的页面。尝试更大的分配。 -
请注意,这些数字都是 1024 的整数倍。
-
@FrançoisAndrieux 如果int只有4个字节,一个页面是4kb,有没有办法查询当前进程在单个页面中使用的数据量?
-
如果您从不写入分配的内存,则操作系统可能永远不会使用物理页面支持分配(因为在您写入之前不需要)。