Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 内存碎片分析器_C++_C_Memory Management_Heap Fragmentation - Fatal编程技术网

C++ 内存碎片分析器

C++ 内存碎片分析器,c++,c,memory-management,heap-fragmentation,C++,C,Memory Management,Heap Fragmentation,有好的内存碎片分析器吗?(linux gcc版本就好了)。Valgrind无法对此进行分析,因为它使用自定义malloc/free函数 谢谢, Andrew我很难理解您可能找到的任何工具如何理解自定义内存管理的段数据结构。您可能能够获得繁忙的分发(挂接到malloc/free),但免费分发(本质上是碎片化)似乎还不确定 那么,为什么不将忙/闲统计数据/直方图添加到自定义内存管理器中呢。如果箱子按与log2(大小)成比例的某个值编制索引,则其O(1)将这些统计信息保持在拆分和合并时的状态,您知道箱

有好的内存碎片分析器吗?(linux gcc版本就好了)。Valgrind无法对此进行分析,因为它使用自定义malloc/free函数

谢谢,
Andrew

我很难理解您可能找到的任何工具如何理解自定义内存管理的段数据结构。您可能能够获得繁忙的分发(挂接到malloc/free),但免费分发(本质上是碎片化)似乎还不确定

那么,为什么不将忙/闲统计数据/直方图添加到自定义内存管理器中呢。如果箱子按与log2(大小)成比例的某个值编制索引,则其O(1)将这些统计信息保持在拆分和合并时的状态,您知道箱子的大小,并且可以使用与log2(大小)成比例的索引直接查找箱子

柱状图间隔

[2^n,2^(n+1))

(例如,如果您想要更细的箱子,请使用对数基数平方根2(大小) 可使用x86上的4条整数指令计算[位扫描、比较、设置、添加])

另一组合理的料仓尺寸是以下打开间隔

[2^n,2^n+2^(n-1)),[2^n+2^(n-1),2^(n+1))

同样容易计算的[bit scan,shift,and,add])

是一个非常好的自定义分配器,附带源代码,经过优化以避免碎片

我将插入该插件,并开始查看其内部日志以获取碎片统计信息。

我将从开始。当您有跟踪时,glibc附带了一个perl脚本mtrace(1)但是,跟踪格式很容易理解,因此应该直接将此过程转换为碎片分析。

恐怕答案是Valgrind

您可以告诉Valgrind使用哪些函数进行分配,以及它如何使用Valgrind代码扩展进行分配(因此您需要修改和重新编译应用程序,但如果不调试,更改将编译到noops),详细信息请参阅Valgrind手册

完成这项工作后,您就有了两个工具来诊断堆的使用情况:massif和DHAT(快速提醒,Valgrind是一组工具,它只运行我们都知道和喜欢的工具,默认情况下是Memcheck)

是一个堆探查器。它测量程序使用的堆内存量。这包括有用的空间,以及为簿记和对齐目的分配的额外字节。它还可以测量程序堆栈的大小,尽管默认情况下不这样做

它可以创建“图形”,因此它是一种图形:

19.63^ ### | # | # :: | # : ::: | :::::::::# : : :: | : # : : : :: | : # : : : : ::: | : # : : : : : :: | ::::::::::: # : : : : : : ::: | : : # : : : : : : : :: | ::::: : # : : : : : : : : :: | @@@: : : # : : : : : : : : : @ | ::@ : : : # : : : : : : : : : @ | :::: @ : : : # : : : : : : : : : @ | ::: : @ : : : # : : : : : : : : : @ | ::: : : @ : : : # : : : : : : : : : @ | :::: : : : @ : : : # : : : : : : : : : @ | ::: : : : : @ : : : # : : : : : : : : : @ | :::: : : : : : @ : : : # : : : : : : : : : @ | ::: : : : : : : @ : : : # : : : : : : : : : @ 0 +----------------------------------------------------------------------->KB 0 29.48 Number of snapshots: 25 Detailed snapshots: [9, 14 (peak), 24] 19.63^ ### | # | # :: | # : ::: | :::::::::# : : :: | : # : : : :: | : # : : : : ::: | : # : : : : : :: | ::::::::::: # : : : : : : ::: | : : # : : : : : : : :: | ::::: : # : : : : : : : : :: | @@@: : : # : : : : : : : : : @ | ::@ : : : # : : : : : : : : : @ | :::: @ : : : # : : : : : : : : : @ | ::: : @ : : : # : : : : : : : : : @ | ::: : : @ : : : # : : : : : : : : : @ | :::: : : : @ : : : # : : : : : : : : : @ | ::: : : : : @ : : : # : : : : : : : : : @ | :::: : : : : : @ : : : # : : : : : : : : : @ | ::: : : : : : : @ : : : # : : : : : : : : : @ 0+------------------------------------------------------------->KB 0 29.48 快照数量:25 详细快照:[9、14(峰值)、24] 更重要的是,有一种方法可以生成非常漂亮的图形


允许您诊断应用程序如何准确地使用其堆,哪些部分是短期的,哪些部分在整个程序生命周期中一直保留,但仅在开始时使用,等等。不幸的是,它没有任何好的图形或图形工具,输出是纯文本。谢天谢地,您可以告诉它您想要获取多少数据,以及如何对其进行排序,使其不像听起来那么糟糕。

您可以使用
gdb
或其他调试器。使用gdb遍历并生成由malloc管理的整个内存缓冲区的配置文件是不可行的。nedmalloc看起来是加速程序的一个很好的方法,但如果没有大量工作。感谢您提供的信息,我正在认真考虑切换到它。其想法是a)nedmalloc处理碎片很好,因此问题不大;b)它内置了调优和源代码,因此您可以使用比mtrace更详细的内省来进行自己的分析。他没有提到自定义分配器。它是例如,有人编写了一个工具,可以在linux上遍历glibc分配器的内部结构。那么“自定义malloc/free函数”中的“自定义”是什么意思?自定义是指valgrind-valgrind在valgrind取代默认分配器时测量malloc碎片是愚蠢的(您要测量的是真实的分配器,而不是valgrind连接的分配器)