内存碎片分析器
有没有好的内存碎片分析器? (linux gcc版本会很好)。 Valgrind无法分析它,因为它使用自定义malloc / free函数。
谢谢,安德鲁
我会从mtrace开始。 当你有一个跟踪时,glibc带有一个perl脚本mtrace(1),它会发现泄漏。 但是,跟踪格式很容易理解,因此应该将其直接处理为碎片分析。
我担心答案是 Valgrind。
你可以告诉Valgrind使用哪些函数进行分配以及如何使用valgrind扩展代码来实现它(所以你需要修改和重新编译你的应用程序,但是如果你没有调试则更改编译为noops),细节是Valgrind手动内存池:使用自定义分配器 。
一旦你完成了这个,你有两个工具可以让你诊断你的堆使用:massif和DHAT(快速提醒,Valgrind是一套工具,它只运行我们都知道和喜欢的,Memcheck,默认) 。
Massif “是一个堆分析器。它测量程序使用多少堆内存。这包括有用的空间,以及为记账和对齐目的分配的额外字节。它还可以测量程序堆栈的大小。 ,虽然默认情况下没有这样做。“
它可以创建“图形”,所以它是一种图形:
19.63 ^ ### | # | #:: | #:::: | :::::::::#:: :: | :#::: :: | :#::: :::: | :#::::: :: | :::::::::::#::::::::: | ::#::::::: :: | ::::::# ::::::::: :: | @@@:::::::::::::: @ | :: @ :::::::::::::: @ | :::: @ :::::::::::::: @ | :::: @ :::::::::::::: @ | :::::::::::::::::::: @ | :::::::::::::::::::::: @ | :::::::::::::::::::::: @ | :::::::::::::::::::::::: @ | :::::::::::::::::::::::: @ 0 + ------------------------------------------------ -----------------------> KB 0 29.48 快照数量:25 详细快照:[9,14(峰值),24]
更重要的是,有一个Massif Visualizer可以产生非常漂亮的图形。
DHAT允许您诊断应用程序使用其堆的确切程度,哪些部分是短暂的,这些部分在整个程序的生命周期中保留,但仅在开始时使用,等等。不幸的是它没有任何漂亮的图形或图形工具。有了它,输出是纯文本。 值得庆幸的是,你可以告诉它你想要获得多少数据以及如何对它进行排序,这样它就不会听起来那么糟糕。
我无法理解您可能找到的任何工具如何理解自定义内存管理的段数据结构。 你或许可以得到繁忙的发行版(挂钩到malloc / free),但是免费发布(基本上是碎片化)似乎在空中。
那么为什么不将忙/免费统计/直方图添加到自定义内存管理器中。 如果垃圾箱按照与log2(大小)成比例的值进行索引,其O(1)将这些统计信息保存为拆分和合并时,您知道尺寸,您可以通过使用与log2(大小)成比例的索引直接查找来找到垃圾箱
例如直方图箱间隔
[2 ^ n,2 ^(n + 1))…
(例如,如果你想要更精细的bin使用log base square root 2(size),可以用x86上的4个整数指令计算[bit scan,compare,set,add])
要使用的另一组合理的箱尺寸是以下开放间隔
[2 ^ n,2 ^ n + 2 ^(n-1)),[2 ^ n + 2 ^(n-1),2 ^(n + 1))…
再次容易计算[位扫描,移位,并添加])
nedmalloc是一个非常好的自定义分配器,附带源代码,经过优化以避免碎片。
我会插入它,并开始查看其内部日志记录的碎片统计信息。