如何分析内存使用情况?

时间:2011-01-14 11:58:55

标签: c++ linux memory profiler valgrind

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

我正在使用Linux机器,因此Windows工具对我没什么帮助。

4 个答案:

答案 0 :(得分:32)

使用massif,这是Valgrind工具的一部分。 massif-visualizer可以帮助您绘制数据图表,也可以使用ms_print命令。

答案 1 :(得分:7)

尝试Google提供的heap profiler gperftools。我总是从源代码构建它,但它可以在几个Linux发行版下以precompiled package的形式提供。

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

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

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

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

Graph of memory usage

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

答案 2 :(得分:0)

“较新”选项为HeapTrack。与massif相反,它是malloc / free的工具版本,可存储所有调用并转储日志。

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

答案 3 :(得分:-2)

在valgrind中使用callgrind选项