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


17

使用ps,我可以看到大小,vsize(与top的VIRT相同)和rss(与top的RES?相同)。(我在顶部看到的另一个是SHR。)

有人可以为我总结这些不同领域的含义吗?


我宁愿在此页面上看到一个不错的摘要,也不希望看到一个可能会消失的链接,以便该页面可以作为参考。
Jim Hunziker,2009年

Answers:


34

简而言之:

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

  • 驻留大小:是专门属于当前驻留在内存中的进程的内存量。这意味着未交换的内存量。请注意,即使进程正在运行,进程的某些部分也可以位于交换内存中。当进程尝试访问交换区时,操作系统将从交换区中拉出这些区域。这应该包括堆,所有线程的堆栈以及其他私有映射。如果你在看/proc/<pid>/maps[stack][heap]和其他匿名映射(那些没有文件路径),要么交换或占驻地的大小。

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

请注意,VIRT包含RSS和SHR的并集,并且始终大于其中的任何一个。可能有一些地区同时被视为RSS和SHR。


2
顺便说一下,在最新版本的linux上,您可以在/ proc / <pid> / smaps中看到非常详细的内存使用情况分类
bdonlan

1
共享大小是存储器可以被共享。如果应用程序是库的唯一用户,则该库将通过单个过程保存在内存中。这样,即使共享内存也可以是“进程拥有的”内存。
休伯特·卡里奥

6

在Juliano中回答:

请注意,RSS + SHR始终等于VIRT。

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

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

要构建具有RSS + SHR> VIRT的进程,只需映射一个大文件(1GB),然后将其完整读取:映射的文件将被加载到RAM中,并且VIRT,SHR和RSS都将分别大于1GB,因此SHR + RSS> VIRT。


是的,它比其他两个更多地是关于VIRT的声明。我想到的更多的是RSS和SHR的结合,而不是它们的总和,即VIRT同时包含RSS和SHR。数学表示能力差。
朱利诺
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.