- 论坛徽章:
- 0
|
不管linux fans愿不愿相信,glibc使用的dlmalloc还有kernel使用的buddy系统,都是有碎片的,但是我在这里更关注的是dlmalloc所产生的碎片:
这幅图引自Advanced Memory Allocation, 图中灰色和蓝色的交替形成了malloc的内存碎片。当调用free的时候,只有trim space和最靠近trim space的free chunks可以被系统回收。
n arena ordblks smblks hblks hblkhd usmblks fsmblks uordblks fordblks keepcost
20 270336 36 5 0 0 0 208 117960 152376 100832
40 303104 24 47 0 0 0 1504 127312 175792 133600
60 487424 6 57 0 0 0 1856 241104 246320 134744
80 487424 8 58 0 0 0 2024 283144 204280 134744
100 487424 13 57 0 0 0 1848 238416 249008 134744
120 487424 38 57 0 0 0 1880 243968 243456 134744
140 487424 58 33 0 0 0 1152 248272 239152 134784
160 487424 46 16 0 0 0 592 246880 240544 134784
180 487424 48 17 0 0 0 648 207152 280272 134784
200 487424 56 88 0 0 0 2336 204920 282504 134784
220 487424 78 22 0 0 0 736 201704 285720 134784
240 487424 70 20 0 0 0 744 201816 285608 134784
260 487424 64 18 0 0 0 672 201928 285496 134784
280 487424 62 18 0 0 0 672 202032 285392 134784
300 487424 62 21 0 0 0 768 202128 285296 134784
320 487424 62 18 0 0 0 624 202248 285176 134784
340 487424 58 18 0 0 0 632 202352 285072 134784
这是我们开发的一个程序运行状态下的mallinfo报告,大家可以看看malloc的效率,当n=20的时候,一共分配了arena=270336 bytes, 真正使用的是uordblks=117960. 其他的都是malloc的mem pool, 效率也就40%差不多。
所以我想找一些工具,首先起码能够帮助我动态输出dlmalloc的chunks layout,这样我可以知道到底是哪些内存块造成了最严重的碎片。当然,如果能够发现自动整理的工具,那就更好了。但是看来希望渺茫。 |
|