【发布时间】:2012-03-01 11:59:21
【问题描述】:
我正在编写的 Core Foundation 应用程序消耗的内存(根据 Activity Monitor 中的“Real Mem”计数)似乎比我实际分配的要多。
我已通过 Instruments 中的 Live Bytes Allocations 视图确认我的实际分配是我期望的(大约 10MB),但是 Activity Monitor 中的“Real Mem”计数显示 > 60MB 并且显然还在增长。我也使用 Instruments 确认没有泄漏。
我的应用程序保留了一个大小不一的缓冲区的大队列,并且在添加/删除队列项时不断地使用 free()-ing 和 malloc()-ing 缓冲区。
阅读了一些关于堆碎片的信息后,这似乎可以解释正在发生的事情。所以我的问题如下:
- 有什么方法可以在 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 = %u\n",
(unsigned long)actual_alloc, (unsigned long)max_alloc);
// max_alloc tends towards 10MB,
// "Real Mem" in activity monitor tends towards 60MB
}
}
return 0;
}
如果你从上面的代码中移除随机元素,你会得到大约 10MB 的进程内存使用量。
【问题讨论】:
标签: c++ c macos memory-management heap-memory