在Linux中如何报告内存使用情况?

使用ps,我可以看到大小,vsize(与top的VIRT?相同)和rss(与top的RES?相同)。 (我最多看到的是SHR。)

有人能为我总结这些不同的领域是什么意思?

简而言之:

  • 虚拟大小:进程正在pipe理的地址空间量。 虚拟地址空间包含进程可以通过指针(内存地址引用)访问的所有内容。 例如,如果您的程序访问您的video卡的帧缓冲区,该内存映射到进程虚拟空间,并接收存储到指针的地址。 内存映射文件和匿名映射也被计入虚拟地址空间大小。 几乎一切都在虚拟的大小。 如果总结/proc/<pid>/maps列出的所有地址范围的大小,它应该返回大致相同的虚拟大小值。

  • 常驻大小:是特定于当前驻留在内存中的进程的内存量。 这意味着,不在交换的内存量。 请注意,即使进程正在运行,进程的某些部分也可以在交换内存中。 当进程尝试访问它时,操作系统将从交换中提取这些区域。 这应该包括堆,所有线程和其他私有映射的堆栈。 如果您查看/proc/<pid>/maps ,则[stack][heap]和其他匿名映射(无文件path的那些映射)将交换或占用常驻大小。

  • 共享大小:是可能属于多个进程的内存量。 例如,如果在内存中加载了四个相同应用程序的实例,则将有四个堆实例和至less四个堆栈,每个进程一个(这是常驻内存),但是只有一个实例程序的二进制代码及其库文件。 这是共享的空间。 它不仅包括程序二进制代码及其库,还包括本地化文件,只读程序数据,SysV和POSIX共享内存段,信号量等等。如果您查看/proc/<pid>/maps ,大多数绑定到库和程序文件的映射是共享的。

请注意,VIRT包含RSS和SHR的联合,并将永远比任何一个更大。 可能有区域被认为是RSS和SHR。

在Juliano回答:

请注意,RSS + SHR <= VIRT,总是。

这只是假的。 SHR包含可以与其他进程共享的所有虚拟内存,RSS包含进程所使用的RAM中的物理内存。

因此,当前在RAM中的所有共享内存都在SHR和RSS中统计,所以SHR + RSS没有意义,因为它可以包含重复计数。

使用RSS + SHR> VIRT构build一个进程,只需mmap一个大文件(1GB),然后完全读取:mmaped文件将被加载到RAM中,而VIRT,SHR和RSS将分别大于1GB,因此SHR + RSS> VIRT。