Are there any good memory fragmentation profilers? (linux gcc version would be nice). Valgrind cannot analyze this because it uses custom malloc/free functions.
Thanks, Andrew
Are there any good memory fragmentation profilers? (linux gcc version would be nice). Valgrind cannot analyze this because it uses custom malloc/free functions.
Thanks, Andrew
我将从mtrace开始。当您进行跟踪时,glibc 会附带一个 perl 脚本 mtrace(1) 来查找泄漏。但是,trace 格式很容易理解,因此应该直接将其处理为碎片分析。
恐怕答案是Valgrind。
您可以告诉 Valgrind 哪些函数用于进行分配,以及它是如何使用 valgrind 扩展代码进行分配的(因此您需要修改和重新编译您的应用程序,但如果您不调试,这些更改将编译为 noops),详细信息在Valgrind 手动内存池:使用自定义分配器。
完成此操作后,您有两个工具可以诊断堆使用情况:massif 和 DHAT(快速提醒,Valgrind 是一组工具,它默认运行我们都知道和喜爱的 Memcheck) .
Massif “是一个堆分析器。它测量您的程序使用了多少堆内存。这包括有用空间,以及为簿记和对齐目的分配的额外字节。它还可以测量程序堆栈的大小(S) ,尽管默认情况下它不会这样做。”
它可以创建“图形”,所以它是一种图形:
19.63^ ### | # | # :: | # : ::: | :::::::::#:::: | : # : : : :: | : # : : : ::: | : # : : : : : :: | ::::::::::: # : : : : : : ::: | : : # : : : : : : :: | ::::: : # : : : : : : : : :: | @@@: : : # : : : : : : : : @ | ::@ : : : # : : : : : : : : @ | :::: @ : : : # : : : : : : : : @ | ::: : @ : : : # : : : : : : : : @ | ::: : : @ : : : # : : : : : : : : @ | :::: : : @ : : : # : : : : : : : : @ | ::: : : : @ : : : # : : : : : : : : @ | :::: : : : : @ : : : # : : : : : : : : @ | ::: : : : : : @ : : : # : : : : : : : : @ 0 +------------------------------------------------ ------------------------------------>KB 0 29.48 快照数量:25 详细快照:[9、14(峰值)、24]
更重要的是,有一个Massif Visualizer可以生成非常漂亮的图表。
DHAT允许您诊断应用程序如何准确地使用它的堆,哪些部分是短暂的,哪些部分会在整个程序的生命周期中保留,但仅在开始时使用,等等。不幸的是,它没有任何漂亮的图表或图形工具可以使用有了它,输出是纯文本。值得庆幸的是,您可以告诉它您想要获取多少数据以及如何对其进行排序,这样它就没有听起来那么糟糕。
我很难理解您可能找到的任何工具如何理解您的自定义内存管理的段数据结构。您可能能够获得繁忙的发行版(挂钩到 malloc/free),但免费发行版(本质上是碎片)似乎悬而未决。
那么为什么不向您的自定义内存管理器添加忙/闲统计/直方图。如果 bin 由与 log2(size) 成比例的东西索引,则它的 O(1) 以保持这些统计信息,因为当您拆分和合并时,您知道大小,您可以使用与 log2(size) 成比例的索引通过直接查找来找到 bin
例如直方图 bin 间隔
[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是一个非常好的自定义分配器,自带源码,优化避免碎片。
我会将其插入,并开始查看其内部日志记录以获取碎片统计信息。