【问题标题】:How to profile memory usage?如何分析内存使用情况?
【发布时间】:2011-06-09 02:44:48
【问题描述】:

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

我在 Linux 机器上工作,所以 windows 工具对我帮助不大。

【问题讨论】:

    标签: c++ linux memory profiler valgrind


    【解决方案1】:

    试用由 Google 与 gperftools 一起提供的 heap profiler。我总是从源代码构建它,但它在多个 Linux 发行版下以 precompiled package 的形式提供。

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

    • HEAP_PROFILE_ALLOCATION_INTERVAL 字节已被程序分配(默认:1Gb)
    • 高水位内存使用标记增加HEAP_PROFILE_INUSE_INTERVAL 字节(默认值:100Mb)
    • HEAP_PROFILE_TIME_INTERVAL 秒已过去(默认:非活动)
    • 您从代码中显式调用 HeapProfilerDump()

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

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

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

    【讨论】:

      【解决方案2】:

      在 valgrind 中使用 callgrind 选项

      【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 谢谢,截图看起来非常棒......,我想这就是我一直想要的。
        • 在 CentOS 7 上构建 massif-visualizer 有点痛苦,但值得。 Instructions
        • 据我了解,我认为这个答案也应该注意(如果应用程序是静态链接的,“Valgrind”系列工具将不起作用):stackoverflow.com/a/13591746/1971003
        • 也可作为 dpkg 使用:sudo apt install massif-visualizer
        • 这似乎不支持 MPI 程序。对吗?
        猜你喜欢
        • 1970-01-01
        • 2010-10-07
        • 2012-02-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多