使用 ps,我可以看到大小、vsize(与 top 的 VIRT 相同?)和 rss(与 top 的 RES 相同?)。(我在 top 中看到的另一个是 SHR。)
有人可以为我总结一下这些不同字段的含义吗?
答案1
简而言之:
虚拟尺寸:是进程管理的地址空间量。虚拟地址空间包含进程可以通过指针(内存地址引用)访问的所有内容。例如,如果您的程序可以访问视频卡的帧缓冲区,则该内存将映射到进程虚拟空间并接收存储到指针的地址。内存映射文件和匿名映射也计入虚拟地址空间大小。几乎所有内容都在虚拟大小中。如果您将 中列出的所有地址范围的大小相加
/proc/<pid>/maps
,它应该会返回与虚拟大小大致相同的值。常驻规模:是当前驻留在内存中的、专门属于该进程的内存量。也就是说,不在交换中的内存量。请注意,即使进程正在运行,进程的某些部分也可能位于交换内存中。当进程尝试访问这些区域时,操作系统将从交换中拉出这些区域。这应该包括堆、所有线程的堆栈和其他私有映射。如果您查看
/proc/<pid>/maps
,则[stack]
和[heap]
其他匿名映射(没有文件路径的映射)要么被交换,要么计入驻留大小。共享大小:是可能属于多个进程的内存量。例如,如果您在内存中加载了同一个应用程序的四个实例,那么您将拥有四个堆实例和至少四个堆栈,每个进程一个(这是常驻内存),但您将只有一个程序二进制代码及其库的实例。这是共享空间。它不仅包括程序二进制代码及其库,还包括本地化文件、只读程序数据、SysV 和 POSIX 共享内存段、信号量等……如果您查看
/proc/<pid>/maps
,会发现与库和程序文件相关的大多数映射都是共享的。
请注意,VIRT 包含 RSS 和 SHR 的并集,并且始终大于其中任何一个。可能存在同时被视为 RSS 和 SHR 的区域。
答案2
朱利亚诺的回答是:
请注意,RSS + SHR 始终 <= VIRT。
这完全是错误的。SHR 包含所有可以与其他进程共享的虚拟内存,而 RSS 包含进程在 RAM 中物理使用的所有内存。
因此,当前 RAM 中的所有共享内存均在 SHR 和 RSS 中计数,所以 SHR + RSS 没有意义,因为它可能包含重复计数。
要构建一个 RSS + SHR > VIRT 的过程,只需映射一个大文件(1GB),然后完整读取它:映射的文件将加载到 RAM 中,VIRT、SHR 和 RSS 都将略大于 1GB,因此 SHR + RSS > VIRT。