我如何测量一个应用程序或进程的实际内存使用情况?
我如何测量一个应用程序或进程的实际内存使用情况?
如何在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
工具。