【发布时间】:2021-06-15 21:04:59
【问题描述】:
我有一个程序在其生命周期内使用的内存总量比我预期的要多得多,我想看看我能做些什么。
我使用 Valgrind 的 memcheck 工具来消除内存泄漏,并使用 Valgrind 的 massif 工具来查看堆快照。 massif 可以告诉我哪些行负责特定时间点的最大堆块。由于地块没有显示任何非常大的东西,我怀疑我的问题是多次执行较小分配的特定行。
如果一些数字会有所帮助:程序运行大约 5 秒,进行密集的数字计算。峰值内存使用量为 1MB。生命周期内存使用量为 10GB。最大的单次分配为 250KB,共进行了 8 次。
因此,我希望看到的不是在任何特定时间点哪些行分配了大量内存,而是在程序的整个生命周期内为每一行分配的总和。我觉得 Valgrind 应该有权访问该信息,因为它正在跟踪每个分配,但我不知道如何让它告诉我。
任何人都可以建议如何使用 Valgrind 来报告此信息,或者另一种工具可以满足我的需求吗?
【问题讨论】:
-
你使用 Fortran 的
POINTER属性吗?如果是,则停止使用它,除非您正在跟踪目标的所有分配/解除分配。 -
有趣的是你应该提到这一点。我开始用 Valgrind 研究这个程序,以摆脱所有的指针,我现在已经完成了,但这就是为什么我看到内存使用量有多大。
-
正如您可能发现的那样,
allocate(ptr(10))将分配 10 个实体的匿名目标。如果您将ptr指针分配给其他对象而没有先解除分配ptr,则会泄漏内存。
标签: debugging optimization fortran valgrind heap-memory