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