我正在使用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。
哪里浪费了内存? : - )
答案 0 :(得分:0)
在这种情况下,mallinfo()会提供虚假信息。
当我在每1M分配后添加mallinfo()时,我可以清楚地看到int是如何溢出,变为负数,然后再次过度再次变为正值。
Excel计算似乎也不正确。我添加了用于计算已分配内存的代码,结果大约是4.7 GB。
顶级显示和实际消费之间仍有1 GB的差异,但这次可以通过分配器的内部数据轻松解释