这个问题在这里详细介绍。 linux
您如何衡量Linux中应用程序或进程的内存使用状况? git
从了解Linux上的内存使用的博客文章中, ps
不是用于此目的的准确工具。 github
为何
ps
是“错误的” 工具根据您的见解,
ps
不会报告进程的实际内存使用状况。 它的真正做用是显示若是每一个进程是惟一运行的进程 , 则每一个进程将占用多少实际内存。 固然,一台典型的Linux计算机在任何给定时间都运行着几十个进程,这意味着ps
报告的VSZ和RSS编号几乎确定是错误的 。 性能
若是您有时间运行,Valgrind会很棒。 valgrind --tool=massif
是正确的解决方案。 spa
可是,我开始运行更大的示例,而且使用valgrind再也不可行。 有没有办法肯定程序的最大内存使用量(模数页面大小和共享页面)? 线程
在实际的UNIX系统上, /usr/bin/time -v
能够工做。 在Linux上,可是,这是行不通的。 code
在最新版本的linux中,使用smaps子系统。 例如,对于PID为1234的进程: 进程
cat /proc/1234/smaps
它会准确告诉您当时它正在使用多少内存。 更重要的是,它将内存划分为私有内存和共享内存,所以您能够知道程序实例正在使用多少内存,而无需包括程序多个实例之间共享的内存。 内存
若是您想要比使用Valgrind进行性能分析更快的速度而且您的内核更旧而且不能使用smaps,则带有选项以显示进程驻留集的ps -o rss,command
(使用ps -o rss,command
)能够为您提供快速且使用的非交换内存的实际数量的合理_aproximation_
。
我正在使用htop
; 这是一个很是好的控制台程序,相似于Windows Task Manager。
使用ps
或相似工具,您将只得到该进程分配的内存页面数量。 该数字是正确的,可是:
不反映应用程序实际使用的内存量,仅反映为其保留的内存量
若是页面被共享(例如由多个线程共享或经过使用动态连接的库)可能会产生误导
若是您确实想知道应用程序实际使用的内存量,则须要在分析器中运行它。 例如, valgrind
能够为您提供有关已用内存量的信息,更重要的是,您能够了解程序中可能的内存泄漏。 valgrind的堆分析器工具称为“ massif”:
Massif是堆分析器。 它经过对程序堆进行按期快照来执行详细的堆分析。 它生成一个图表,显示随时间推移的堆使用状况,包括有关程序的哪些部分负责最多内存分配的信息。 该图由文本或HTML文件补充,该文本或HTML文件包含更多信息,用于肯定分配最大内存的位置。 Massif运行的程序比正常运行慢约20倍。
如valgrind文档中所述,您须要经过valgrind运行程序:
valgrind --tool=massif <executable> <arguments>
Massif写入内存使用状况快照的转储(例如massif.out.12345
)。 这些提供了(1)内存使用的时间表,(2)每一个快照,记录了程序存储器中的分配位置。 massif-visualizer是分析这些文件的一种出色的图形工具。 可是我发现ms_print
这个由valgrind附带的简单的基于文本的工具已经ms_print
了。
要查找内存泄漏,请使用valgrind的(默认) memcheck
工具。