Answers:
简而言之:
虚拟大小:是进程正在管理的地址空间量。虚拟地址空间包含进程可以通过指针(内存地址引用)访问的所有内容。例如,如果您的程序可以访问视频卡的帧缓冲区,则该内存将映射到进程虚拟空间并接收存储到指针的地址。内存映射文件和匿名映射也计入虚拟地址空间大小。几乎所有内容都在虚拟大小中。如果您对列出的所有地址范围的大小进行汇总/proc/<pid>/maps
,则应该返回与虚拟大小大致相同的值。
驻留大小:是专门属于当前驻留在内存中的进程的内存量。这意味着未交换的内存量。请注意,即使进程正在运行,进程的某些部分也可以位于交换内存中。当进程尝试访问交换区时,操作系统将从交换区中拉出这些区域。这应该包括堆,所有线程的堆栈以及其他私有映射。如果你在看/proc/<pid>/maps
的[stack]
,[heap]
和其他匿名映射(那些没有文件路径),要么交换或占驻地的大小。
共享大小:是可能属于多个进程的内存量。例如,如果您在内存中加载了同一个应用程序的四个实例,则将有四个堆实例和至少四个堆栈,每个进程一个(这是驻留内存),但是您只有一个实例。该程序及其库的二进制代码。这是共享空间。它不仅包括程序二进制代码及其库,还包括本地化文件,只读程序数据,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的进程,只需映射一个大文件(1GB),然后将其完整读取:映射的文件将被加载到RAM中,并且VIRT,SHR和RSS都将分别大于1GB,因此SHR + RSS> VIRT。