【发布时间】:2021-10-19 19:26:37
【问题描述】:
我正在编写一个 C++ 程序,发现它消耗了太多内存。我想知道程序的哪个部分消耗的内存最多,理想情况下,我想知道程序在特定时刻使用哪种 C++ 对象消耗了多少内存。
在 Java 中,我知道 Eclipse Memory Analyzer (https://www.eclipse.org/mat/) 之类的工具可以进行堆转储并显示/可视化此类内存使用情况,我想知道这是否可以用于 C++ 程序。例如,我希望使用一种工具/方法让我知道特定的 vector<shared_ptr<MyObject>> 占用了 30% 的内存。
注意:
- 我主要在macOS上开发程序(使用Apple Clang编译),所以如果该方法适用于macOS会更好。但我也部署到 Linux(使用 gcc 编译),所以 Linux 上的方法/工具没问题。
- 我尝试使用 Apple 的 Intruments 来实现此目的,但目前我只能使用它来查找内存分配问题。我不知道如何计算程序在特定时刻的内存消耗(内存消耗应该与程序中的 C++ 对象相关,以便我可以采取一些措施来相应地减少它)。
【问题讨论】:
-
自从我使用它已经有一段时间了,所以我无法帮助您了解详细信息,但 Instruments 无法记录您的应用程序所做的每个分配以及显示您在何处进行分配的堆栈跟踪从?无论如何,那是我的(模糊的)回忆。
-
@PaulSanders 是的,它可以,但问题是很多分配都是临时的。内存被分配然后释放,我不关心那些临时分配。我想知道在特定时刻哪个部分占用了最多的内存。
-
我建议检查您的代码并消除所有不必要的内存分配并再次尝试运行。
-
shared_ptr的使用意味着您没有明确的MyObjects 的“所有者”。你如何确保他们的及时清理?还是所有这些对象在您的程序期间都存在?多大的内存是“太多”?单个物体的大小是多少?你希望有多少?这些数字加起来了吗? -
@nybon 然后你需要一些内存分析器,tcmalloc 会是你的朋友,但它会降低性能很多(如果你有大量线程使用会慢 50 倍)。因此,如果您的程序是在线服务,我们可能需要考虑复制部分网络请求,以确保服务器不会过载。
标签: c++ memory-management instruments