RSS(Resident Set Size,驻留集大小)是:一个进程当前有多少内存页面实际驻留在物理内存 RAM 中。
简单理解:
RSS 看的是“现在有多少页面真的在内存条里”,而不是申请了多少地址或获得了多少内存承诺。
接着用酒店来理解
| 概念 | 酒店比喻 |
|---|---|
| 虚拟地址空间 | 圈出了多少房间编号 |
| 提交量 | 正式预订了多少房间 |
| RSS | 现在实际入住了多少房间 |
例如,一个游戏:
保留虚拟地址:8 GB 提交内存: 2 GB如果这部分已提交内存中,当前有500 MB驻留在 RAM,那么这部分对 RSS 的贡献就是约500 MB。
不过,游戏还会加载代码、动态库、映射文件等,它们驻留的页面也可能计入 RSS,所以整个进程的 RSS 不一定就是 500 MB。
RSS 包含哪些内存?
通常包括当前驻留在 RAM 中的:
- 程序代码;
- 堆内存,例如游戏对象、部分资源数据;
- 栈内存;
- 动态库;
- 文件映射和共享内存页面。
不包括:
- 只是保留、没有实际驻留的地址范围;
- 已被换出、当前不在 RAM 中的页面。
独立显卡的显存也不能简单算进 RSS。
最容易误解:RSS 不全是进程“独占”的
假设两个进程共享同一份100 MB的动态库页面,而且这些页面都计入各自的驻留集:
进程 A 的 RSS:包含这 100 MB 进程 B 的 RSS:也包含这 100 MB但物理内存里,这份共享页面只有一份。
因此:
把所有进程的 RSS 相加,可能重复计算共享内存。
这也是为什么 Linux / Android 中还会看PSS:
RSS:共享页面在每个进程中都完整计入。 PSS:共享页面按比例分摊。在上面的例子里,如果只有这两个进程共享,100 MB 对各自 PSS 的贡献就是约50 MB。
RSS 高就说明内存泄漏吗?
不一定。
RSS 上升可能是:
- 加载了更多资源;
- 访问了原先尚未驻留的页面;
- 分配器保留了已释放的内存,准备复用;
- 确实发生了内存泄漏。
因此:
释放游戏对象 ≠ 内存立即归还操作系统 ≠ RSS 立即下降一句话记住
提交量是“系统答应提供多少”,RSS 是“当前有多少页面真的在 RAM 里”,但其中可能有与其他进程共享的部分。
RSS 常见于 Linux / Android;Windows 中与它相近的概念叫Working Set(工作集)。