内存碎片分析器有什么推荐吗?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (4)
  • 关注 (0)
  • 查看 (85)

有什么好的内存碎片分析器吗?(LinuxGCC版本很好)。但是它使用自定义malloc/free函数,所以无法分析这一点。

提问于
用户回答回答于

nedmalloc是一个很好的自定义分配器,附带源代码,优化以避免碎片。

我会插上这个插件,然后开始查看它的内部日志记录,以获取碎片统计数据。

用户回答回答于

向你的自定义内存管理器添加繁忙/空闲统计信息/直方图。如果用与log 2(大小)成比例的东西来索引回收箱,那么它的O(1)就会保持这些统计数据,就像拆分和合并时一样,你知道大小,并且可以通过使用与log 2成比例的索引(大小)直接查找到bin。

直方图bin区间

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

(例如,如果你想要更细的垃圾桶,使用日志基平方根2(大小),它可以用x86上的4个整数指令来计算[位扫描,比较,设置,添加])

另一组合理的容器大小为以下打开间隔

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

同样容易计算位扫描,移位,和,加法)

用户回答回答于

Valgrind。

可以告诉Val差事哪些函数用于分配,以及它如何使用代码的val差使扩展(因此需要修改和重新编译应用程序,但是如果没有调试,则将这些更改编译到Noops),详细信息在Val差制手册内存池:使用自定义分配器中。

完成此操作后,可以使用两个工具来诊断堆的使用情况:massif和dhat(快速提醒,Valgrind是一个对于工具,它只是运行我们都知道和喜欢的工具,默认情况下是memcheck)。

Massif “是堆分析器。它测量程序使用多少堆内存。这既包括有用的空间,也包括为簿记和对齐目的分配的额外字节。它还可以测量程序堆栈的大小,尽管默认情况下它不会这样做。“

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

19.63^                                               ###                      
     |                                               #                        
     |                                               #  ::                    
     |                                               #  : :::                 
     |                                      :::::::::#  : :  ::               
     |                                      :        #  : :  : ::             
     |                                      :        #  : :  : : :::          
     |                                      :        #  : :  : : :  ::        
     |                            :::::::::::        #  : :  : : :  : :::     
     |                            :         :        #  : :  : : :  : :  ::   
     |                        :::::         :        #  : :  : : :  : :  : :: 
     |                     @@@:   :         :        #  : :  : : :  : :  : : @
     |                   ::@  :   :         :        #  : :  : : :  : :  : : @
     |                :::: @  :   :         :        #  : :  : : :  : :  : : @
     |              :::  : @  :   :         :        #  : :  : : :  : :  : : @
     |            ::: :  : @  :   :         :        #  : :  : : :  : :  : : @
     |         :::: : :  : @  :   :         :        #  : :  : : :  : :  : : @
     |       :::  : : :  : @  :   :         :        #  : :  : : :  : :  : : @
     |    :::: :  : : :  : @  :   :         :        #  : :  : : :  : :  : : @
     |  :::  : :  : : :  : @  :   :         :        #  : :  : : :  : :  : : @
   0 +----------------------------------------------------------------------->KB     0                                                                   29.48

Number of snapshots: 25
 Detailed snapshots: [9, 14 (peak), 24]

更重要的是地块可视化器产生了非常漂亮的图表。

DHAT允许准确地诊断应用程序如何使用它的堆,哪些部分是短暂的,这些部分贯穿整个程序的生命周期,但仅在开始时使用。不幸的是,它没有任何好的图形或图形工具与它一起使用,输出是纯文本。你可以告诉它你想要获得多少数据,以及如何分类,这样就不会像听起来那么糟糕了。

用户回答回答于

我会从mtrace开始。当你有跟踪时,glibc附带了一个Perl脚本mtrace(1),它可以查找泄漏。然而,跟踪格式很容易理解,所以应该直接将这一过程转化为碎片分析。

扫码关注云+社区

领取腾讯云代金券