如何跟踪重复分配的生命周期堆使用情况

How to track lifetime heap usage from repeated allocations

我有一个程序在其整个生命周期内使用的内存总量比我预期的要多得多,我想看看我能做些什么。

我使用 Valgrind 的 memcheck 工具来消除内存泄漏,并使用 Valgrind 的 massif 工具查看堆快照。 massif 可以告诉我哪些行负责特定时间点的最大堆块。由于 massif 没有显示任何非常大的东西,我怀疑我的问题是多次进行较小分配的特定行。

如果一些数字会有所帮助:程序运行大约 5 秒,进行大量的数值计算。峰值内存使用量为 1MB。生命周期内存使用量为 10GB。最大的单次分配是 250KB 并且完成了 8 次。

因此,我希望看到的不是在任何特定时间点哪些行分配了大量内存,而是分配的每一行在程序的整个生命周期内的总和。我觉得 Valgrind 应该可以访问该信息,因为它跟踪每个分配,但我不知道如何让它告诉我。

任何人都可以建议如何使用 Valgrind 报告此信息,或其他工具可以满足我的要求吗?

据我了解,您不想查看当前内存使用情况的 'snapshot', 但是您想查看堆栈跟踪完成的累积分配,即使 如果释放了大部分分配的内存。

为此,您可以尝试选项 --xtree-memory=full。

The xtrees produced by the option --xtree-memory or the xtmemory monitor command are showing the following events/resource consumption describing heap usage:

    curB current number of Bytes allocated. The number of allocated bytes is added to the curB value of a stack trace for each allocation. It is decreased when a block allocated by this stack trace is released (by another "freeing" stack trace)

    curBk current number of Blocks allocated, maintained similary to curB : +1 for each allocation, -1 when the block is freed.

    totB total allocated Bytes. This is increased for each allocation with the number of allocated bytes.

    totBk total allocated Blocks, maintained similary to totB : +1 for each allocation.

    totFdB total Freed Bytes, increased each time a block is released by this ("freeing") stack trace : + nr freed bytes for each free operation.

    totFdBk total Freed Blocks, maintained similarly to totFdB : +1 for each free operation.

Note that the last 4 counts are produced only when the --xtree-memory=full was given at startup.

此选项适用于各种工具,以及生成的文件 可以形象化a.o。使用 kcachegrind。

https://www.valgrind.org/docs/manual/manual-core.html#opt.xtree-memoryhttps://www.valgrind.org/docs/manual/manual-core.html#manual-core.xtree 了解更多信息。

您也可以尝试使用 --tool=dhat,这是一种专门用于报告您的程序对分配的内存执行了哪些操作的工具。