在Linux上测量和跟踪内存消耗
在Linux上测量和跟踪内存消耗
如何在Linux中测量应用程序或进程的内存使用情况?根据《理解Linux上的内存使用情况》博客文章,ps
不是用于此目的的准确工具。
为什么
ps
是“错误的”根据您的观察方式,
ps
不会报告进程的实际内存使用情况。它真正做的是显示每个进程将占用多少实际内存如果它是唯一运行的进程。当然,典型的Linux机器在任何给定时间都有几十个进程运行,这意味着ps
报告的VSZ和RSS数字几乎肯定是错误的。
(注:这个问题在这里得到了详细的解答。)
使用 ps
或类似的工具,您只能获取进程分配的内存页面数量。此数字是正确的,但是:
-
并不反映应用程序实际使用的内存量,仅反映为其保留的内存量
-
如果页面是共享的,则可能会产生误导,例如通过多个线程或使用动态链接库
如果您真的想知道应用程序实际使用的内存量,您需要在分析器中运行它。例如,Valgrind 可以为您提供有关使用的内存量以及程序中可能存在的内存泄漏的见解。 Valgrind 的堆分析工具称为 'massif':
Massif 是一个堆分析器。它通过定期对程序的堆进行快照来进行详细的堆剖析。它生成显示随时间变化的堆使用情况的图表,包括有关哪些部分负责最多内存分配的信息。图表通过包含有关确定最多内存分配的更多信息的文本或 HTML 文件进行补充。 Massif 运行程序的速度比正常速度慢约 20 倍。
正如在 Valgrind 文档 中所解释的那样,您需要通过 Valgrind 运行程序:
valgrind --tool=massif
Massif 写入内存使用快照的转储(例如 massif.out.12345
)。这些提供(1) 内存使用时间线,(2) 对于每个快照,记录了内存在程序中的分配位置。用于分析这些文件的伟大图形工具是 massif-visualizer。但是我已经发现,Valgrind 提供的一个名为 ms_print
的简单基于文本的工具非常有帮助。
要查找内存泄漏,请使用 Valgrind 的(默认)memcheck
工具。