malloc消费远不如流程本身

时间:2014-11-15 17:13:06

标签: c malloc

我正在使用gcc在C中开发哈希表。

对于碰撞我正在使用链表。

当我加载~1 GB文件时,mallinfo()显示:

Total non-mmapped bytes        arena      =      1753260032
# of free chunks               ordblks    =               2
# of free fastbin blocks       smblks     =               0
# of mapped regions            hblks      =               1
Bytes in mapped regions        hblkhd     =         8003584
Max. total allocated space     usmblks    =               0
Free bytes held in fastbins    fsmblks    =               0
Total allocated space          uordblks   =      1753126384
Total free space               fordblks   =          133648
Topmost releasable block       keepcost   =          133072

如果我使用Excel计算内存消耗量大约为2 GB,这与mallinfo()显示的1.7 GB类似。

同时,top或htop中显示的linux进程使用5.7 GB。

试过jemalloc和tcmalloc,结果或多或少相似。进程总是使用大约5.7 GB。

我知道malloc必须做一些可用内存“碎片”或类似内容的链表,但即使内存块对齐,5 GB也会超过2 GB。

哪里浪费了内存? : - )

1 个答案:

答案 0 :(得分:0)

在这种情况下,mallinfo()会提供虚假信息。

当我在每1M分配后添加mallinfo()时,我可以清楚地看到int是如何溢出,变为负数,然后再次过度再次变为正值。

Excel计算似乎也不正确。我添加了用于计算已分配内存的代码,结果大约是4.7 GB。

顶级显示和实际消费之间仍有1 GB的差异,但这次可以通过分配器的内部数据轻松解释