诊断Mac OS X上的堆碎片
Diagnosing heap fragmentation on Mac OS X?
我正在编写的Core Foundation应用程序消耗的内存(根据活动监视器中的"Real Mem"计数)似乎比我实际分配的内存多得多。
我已经通过Instruments中的Live Bytes allocations视图确认了我的实际分配是我预期的(约10MB),但Activity Monitor中的"Real Mem"计数显示>60MB,并且明显在增长。我也确认没有泄漏,也使用仪器。
我的应用程序保留了一个由不同大小的缓冲区组成的大队列,并在添加/删除队列项目时不断释放()和malloc()缓冲区。
读过一些关于堆碎片化的文章后,这似乎是对正在发生的事情的一个可能的解释。所以我的问题如下:
- 有什么方法可以在OS X上确认这一点吗?例如,可以获得堆的可视化表示
- OS X是否像Windows一样有可选的低碎片堆管理器
对于任何想要复制这个问题的人来说,下面的示例代码很好地显示了相同的症状:
#define MAX_SIZE (10*1024*1024)
int main (int argc, const char * argv[])
{
size_t actual_alloc=0;
size_t max_alloc=0;
char *bigbuf=NULL;
size_t bigsize=0;
for (long x=0; x<10000000; x++)
{
if (bigbuf!=NULL)
{
actual_alloc -= bigsize;
free(bigbuf);
}
bigsize = rand() % MAX_SIZE; // alloc random amount up to MAX_SIZE
bigbuf = (char*)malloc(bigsize);
memset(bigbuf, 'x', bigsize);
actual_alloc += bigsize;
if (actual_alloc > max_alloc)
max_alloc = actual_alloc;
if (x%100==0)
{
printf("alloc = %u t max = %un",
(unsigned long)actual_alloc, (unsigned long)max_alloc);
// max_alloc tends towards 10MB,
// "Real Mem" in activity monitor tends towards 60MB
}
}
return 0;
}
如果您从上面的代码中删除随机元素,您将获得大约10MB的进程内存使用量。
堆是一个复杂的数据结构,您看到的是正常的。仅仅因为释放()缓冲区并不意味着库将内存返回给操作系统。系统调用是有代价的,所以当分配系统请求一块内存时,它往往会要求比它需要的更多的内存,这样后续的分配就可以在不进入内核的情况下返回内存。堆还可能为不同的分配大小维护多个分配区域,以避免长时间搜索和碎片化。通过进行随机大小的分配,您已经成功地初始化了其中的几个bucket。
您无法预测所链接的内存分配子系统或其他系统库的行为,因此"活动监视器"或top或任何其他工具都不会为您提供有意义的信息。如果您想跟踪内存分配或泄漏,请使用malloc调试器或类似valgrind的工具。
相关文章:
- 在没有Xcode的情况下在Mac捆绑包中嵌入框架
- OpenGL在启用深度测试时不会丢弃我的碎片
- c++17文件系统::recursive_directory迭代器()在mac上没有给出这样的目录,但在windows上
- 如何使用CLion在Mac上创建一个新的.txt文件
- 如何使用Clang/GCC在Mac上为C/C++设置VSCode
- 在 Mac 上使用 CMAKE 将 FFTW 和 FFTWPP 链接到项目中时未定义的符号
- 有人安装"IITB Simplecpp in mac"吗?
- libprotobuf 检查在 Mac OS 上执行程序时失败
- 如何在 Mac 上使用 c++17 并行标准库算法?
- 在 Mac 上的 python 上提升
- 我可以在 iOS 或 mac 应用程序中使用C++代码吗?
- 如何在 Mac 上正确编译C++,当它在 Linux 上编译没有问题时?
- C++读取用户输入而不按回车键(Mac OS X),与Turbo Pascal中的读取键相同
- 如何在 MAC OS c/c++ 中阻止 USB 存储设备
- 避免碎片化的ClientHellos with OpenSSL (DTLS)
- 编译在我的 Mac 上工作,但在集群 (Linux) 上不起作用
- 在装有 CLion 的 Mac 上使用 C++ 连接到 MySQL 数据库时出现问题
- 动态获取 esp32 的 mac 地址并在以太网库中使用它.
- GDB 断点在 Mac 上是不准确的
- 诊断Mac OS X上的堆碎片