目录
1.1 VSS(虚拟内存 Virtual Set Size)
1.2 RSS(常驻内存 Resident Set Size)
1.3 PSS(比例驻留内存 Proportional Set Size)
1.4 USS(独占驻留内存 Unique Set Size)
在 Android 中,dumpsys meminfo 或其他内存分析工具(如 adb shell cat /proc/PID/smaps)提供了多个 内存使用指标,常见的包括 VSS、RSS、PSS、USS 等。
1. 主要内存项
缩写 | 全称 | 含义 |
VSS | Virtual Set Size (虚拟集大小) | 进程分配的全部虚拟地址空间,包括未实际使用的部分。 |
RSS | Resident Set Size (常驻集大小) | 进程实际驻留在RAM中的物理内存(包括共享内存)。 |
PSS | Proportional Set Size (比例集大小) | 进程实际使用的物理内存,按共享内存按比例分摊计算。 |
USS | Unique Set Size (独占集大小) | 进程独占使用的物理内存,不包含共享部分。 |
1.1 VSS(虚拟内存 Virtual Set Size)
概念:进程申请的 所有虚拟地址空间,它是一个进程能访问的所有内存空间地址的大小,包括:
- 实际使用的物理内存
- 未映射到 RAM 的虚拟内存(如 mmap() 但未写入的页面)
- 映射的文件(如 SO 库、Dex、映射 I/O)
- 匿名映射(Anonymous Mapping,如 malloc 分配但未使用的部分)
- 共享库的映射地址空间
特点:
- 不能直接表示进程真实的物理内存占用
- 大多数进程的 VSS 远大于实际物理内存使用
- 一般不用于衡量内存占用
示例:
adb shell cat /proc/$(pidof com.example.app)/status | grep VmSize
输出:
VmSize: 1200000 kB
表示该进程 分配了 约 1.2GB 的 虚拟地址空间。
1.2 RSS(常驻内存 Resident Set Size)
概念:进程当前实际驻留 在 RAM 中的物理内存,RSS可能会产生误导,因为它包含了所有该进程使用的共享库所占用的内存,一个被加载到内存中的共享库可能有很多进程会使用它。RSS不是单个进程使用内存量的精确表示包括:
- 代码段、数据段
- 共享库映射的内存(但不按比例计算)
- 未被 swap 出去的部分
特点:
- 比 VSS 更能反映 进程真实占用的物理内存
- 但 RSS 计算了全部共享内存,不适用于多进程系统分析
- 适合评估进程“驻留 RAM” 的情况
示例:
adb shell cat /proc/$(pidof com.example.app)/status | grep VmRSS
输出:
VmRSS: 256000 kB
表示该进程实际驻留在物理 RAM 的大小为 256MB。
1.3 PSS(比例驻留内存 Proportional Set Size)
概念:进程实际占用的物理内存,共享内存按比例分摊:
它会按比例分配共享库所占用的内存。 例如,如果有三个进程共享一个占30页内存控件的共享库,每个进程在计算PSS的时候,只会计算10页。 PSS是一个非常有用的数值,如果系统中所有的进程的PSS相加,所得和即为系统占用内存的总和。当一个 进程被杀死后,它所占用的共享库内存将会被其他仍然使用该共享库的进程所分担。在这种方式下,PSS 也会带来误导,因为当一个进程被杀后,PSS并不代表系统回收的内存大小。
- 独占的物理内存 100% 计算
- 共享内存(如共享库)按 多个进程分摊计算
特点:
- 比 RSS 更精确,适合衡量进程的真实内存占用
- Android 主要使用 PSS 评估应用占用的内存
- 比 USS 更准确,避免了忽略共享内存的误差
示例:
adb shell dumpsys meminfo <package_name>
输出:
PSS TOTAL: 128000 kB
表示该进程 真实占用 RAM 为 128MB(已考虑共享内存)。
1.4 USS(独占驻留内存 Unique Set Size)
概念:进程 独占的物理内存,不包含共享内存。USS是一个非常有用的数值,因为它表明了运行一个特定进程所需的真正内存成本。当一个进程被杀死,USS就是所有系统回收的内存。USS是用来检查进程中是否有内存泄露的最好选择。
特点:
- 适用于分析进程独占的 RAM 需求
- 但可能低估真实占用(忽略共享库的影响)
- 不适合评估整个系统的内存占用
示例:
adb shell procrank
输出:
PID Vss Rss Pss Uss
12345 1000000K 250000K 130000K 90000K
其中 USS=90MB,表示该进程 独占 90MB 物理 RAM。
2. 其他内存项
名称 | 含义 |
SwapPss | 进程在swap(交换分区)中的占用(按 PSS 分摊计算)。 |
Heap Size | 进程的 Java/Kotlin堆大小(Heap Size)。 |
Heap Alloc | 已分配的 Java/Kotlin 堆内存。 |
Heap Free | 未使用的 Java/Kotlin 堆内存。 |
Dalvik Heap | Dalvik 虚拟机(ART)内存。 |
Native Heap | C/C++ 代码的 native heap 内存(malloc/new)。 |
Graphics | GPU 显存(OpenGL/渲染缓存)。 |
Ashmem | Android 共享内存区域(Anonymous Shared Memory)。 |
3.内存指标选择
用途 | 推荐指标 | 原因 |
分析进程的真实内存占用 | PSS | 共享内存按比例分摊,反映真实占用 |
分析进程的独占 RAM | USS | 仅计算进程独占的物理内存 |
分析系统 RAM 驻留情况 | RSS | 包括进程的全部驻留内存 |
分析进程虚拟内存 | VSS | 了解进程地址空间大小(但不等于物理占用) |
查找内存泄漏 | Heap Size / Alloc | 分析 Java Heap、Native Heap |
4. 重点总结
- VSS:分配的虚拟内存(误导性大)。
- RSS:驻留 RAM(包含共享内存)。
- PSS:推荐,真实占用(共享内存按比例分摊)。
- USS:进程独占 RAM(不计算共享部分)。
如果你要分析 Android 算法的内存占用,建议主要关注:
- PSS(进程真实占用)
- USS(进程独占部分)
- Native Heap(C++ 代码占用)