【问题标题】:Diagnosing heap fragmentation on Mac OS X?在 Mac OS X 上诊断堆碎片?
【发布时间】: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 缓冲区。

阅读了一些关于堆碎片的信息后,这似乎可以解释正在发生的事情。所以我的问题如下:

  1. 有什么方法可以在 OS X 上确认这一点,例如也许得到堆的视觉表示?
  2. 是否有适用于 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


    【解决方案1】:

    堆是一个复杂的数据结构,你看到的很正常。仅仅因为你 free() 一个缓冲区并不意味着库正在将该内存返回给操作系统。系统调用是有代价的,所以当分配系统请求一块内存时,它往往会请求比它需要的更多的内存,以便后续分配可以返回内存而无需进入内核。堆还可能为不同的分配大小维护几个分配区域,以避免长时间搜索和碎片。通过分配随机大小,您已经成功地初始化了其中的几个桶。

    您无法预测您链接的内存分配子系统或其他系统库的行为,因此 Activity Monitor 或 top 或任何其他工具不会为您提供有意义的信息。如果您想跟踪内存分配或泄漏,请使用 malloc 调试器或 valgrind 等工具。

    【讨论】:

    • 抱歉,我的问题可能不清楚,我知道这是正常行为。我想知道的是 (1) 是否有测量堆碎片的工具,所以我可以证明是我的应用程序导致了它,以及 (2) 是否有适用于 OS X 的低碎片堆管理器,就像适用于 Windows 一样。跨度>
    猜你喜欢
    • 2016-08-14
    • 1970-01-01
    • 2010-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-31
    • 2014-07-14
    • 1970-01-01
    相关资源
    最近更新 更多