如何分析内存使用情况?

mat*_*ath 33 c++ linux memory profiler valgrind

我知道Valgrind,但它只是检测内存管理问题.我正在搜索的是一个工具,它给了我一个概述,我的程序的哪些部分确实消耗了多少内存.使用例如树图(如KCachegrind为Callgrind所做的)的图形表示将是很酷的.

我正在使用Linux机器,因此Windows工具对我没有多大帮助.

ism*_*ail 35

使用massif,它是Valgrind工具的一部分.massif-visualizer可以帮助您绘制数据图形,或者您可以使用该ms_print命令.


Pao*_*o M 8

尝试使用gperftools提供的堆分析器.我总是从源代码构建它,但它可以作为几个Linux发行版下的预编译包.

将动态库链接到可执行文件并运行程序就像使用它一样简单.它收集有关每个动态内存分配的信息(据我所见),并在每次发生以下任一情况时将内存转储保存到磁盘:

  • HEAP_PROFILE_ALLOCATION_INTERVAL 字节已由程序分配(默认值:1Gb)
  • 高水位内存使用标记按HEAP_PROFILE_INUSE_INTERVAL字节增加(默认值:100Mb)
  • HEAP_PROFILE_TIME_INTERVAL 秒已过(默认值:无效)
  • 您明确地HeapProfilerDump()从您的代码中调用

根据我的经验,最后一个是最有用的,因为您可以准确控制何时获取堆使用情况的快照,然后比较两个不同的快照并查看错误.

最终,有几种可能的输出格式,如文本或图形(以有向图的形式):

内存使用情况图

使用此工具,我已经能够发现使用Massif无法找到的不正确的内存使用情况.


Mat*_*her 5

“较新”的选项是HeapTrack。与 massif 相反,它是malloc/ 的一个检测版本,free它存储所有调用并转储日志。

GUI 很好(但需要 Qt5 IIRC)并且结果计时(因为您可能还想跟踪时间)比 valgrind 偏差小(因为它们没有被模拟)。