RSS 是 Resident Set Size (常驻内存大小) 的缩写, 用于表示进程使用了多少内存 (RAM 中的物理内存),RSS 不包含已经被换出的内存. RSS 包含了它所链接的动态库并且被加载到物理内存中的内存. RSS 还包含栈内存和堆内存.
VSZ 是 Virtual Memory Size (虚拟内存大小) 的缩写. 它包含了进程所能访问的所有内存, 包含了被换出的内存, 被分配但是还没有被使用的内存, 以及动态库中的内存.
假设进程 A 的二进制文件是 500K, 并且链接了一个 2500K 的动态库, 堆和栈共使用了 200K, 其中 100K 在内存中 (剩下的被换出或者不再被使用), 一共加载了动态库中的 1000K 内容以及二进制文件中的 400K 内容至内存中, 那么:
- RSS: 400K + 1000K + 100K = 1500K
- VSZ: 500K + 2500K + 200K = 3200K
由于部分内存是共享的, 被多个进程使用, 所以如果将所有进程的 RSS 值加起来可能会大于系统的内存总量.
申请过的内存如果程序没有实际使用, 则可能不显示在 RSS 里. 比如说一个程序, 预先申请了一大批内存, 过了一段时间才使用, 你会发现 RSS 会增长而 VSZ 保持不变.
还有一个概念是 PSS, 它是 proportional set size (proportional 是成比例的意思) 的缩写. 这是一种新的度量方式. 它将动态库所使用的内存按比例划分. 比如我们前面例子中的动态库如果是被两个进程使用, 那么:
PSS: 400K + (1000K/2) + 100K = 400K + 500K + 100K = 1000K
一个进程中的多个线程共享同样的地址空间. 所以一个进程中的多个线程的 RSS,VSZ,PSS 是完全相同的. Linux 下可以使用 ps 或者 top 命令查看这些信息.
如果想了解更多, 可参考下面的链接:
A way to determine a process's"real" memory usage, i.e. private dirty RSS?
来源: http://www.tuicool.com/articles/Ebu6Fv7