什么是 procrank?
procrank 是一个在 Android 系统中非常有用的命令行工具,它的主要作用是 报告每个正在运行的进程的内存占用情况,特别是它们的 VSS、RSS、PSS 和 USS 值,这些值可以帮助开发者、系统工程师和高级用户深入理解一个应用到底“吃”了多少内存,从而进行性能分析和优化。

重要提示:procrank 通常只在 Android 开发者选项 或 root 后的设备上可用,在标准的、未 root 的消费级设备上,你通常无法直接运行它。
procrank 的核心作用:四种内存指标
procrank 输出的核心就是这四个内存指标,理解它们的区别是使用 procrank 的关键。
VSS (Virtual Set Size) - 虚拟内存集大小
- 定义:进程虚拟地址空间的总大小,这包括了进程当前使用的所有内存,以及它被允许使用但尚未实际分配的内存(比如代码库、动态链接库等)。
- 通俗理解:就像你租了一套房子,VSS 就是这套房子的总建筑面积,包括你实际住的房间、储藏室,以及你理论上可以使用的阳台、花园等所有区域。
- 特点:这个值通常非常大,因为它包含了大量未使用的内存。单独看 VSS 意义不大,它不能真实反映进程的内存压力。
RSS (Resident Set Size) - 常驻内存集大小
- 定义:进程当前实际物理内存(RAM)的占用大小,这些内存是进程正在使用并且已经被加载到物理内存中的部分。
- 通俗理解:还是那个房子,RSS 就是你现在正在住的那个房间的面积,它代表了进程对物理内存的真实、直接占用。
- 特点:RSS 是一个很好的指标,但它有一个致命缺陷:如果多个进程共享同一个库文件(如
libc.so),这个库文件占用的物理内存会被重复计算到每个使用它的进程中,这会导致 RSS 总和远大于系统实际的物理内存占用,造成误导。
PSS (Proportional Set Size) - 比例集大小
- 定义:这是 Android 系统中最重要、最准确的内存指标之一,它将共享内存(如库文件)按比例分摊到每个使用它的进程中。
- 通俗理解:还是那个共享的图书馆(库文件),RSS 计算方式是每个读者(进程)都把整个图书馆算作自己的,而 PSS 的计算方式是,图书馆有 100 本书,有 10 个读者在读,那么每个读者只算 10 本书(100/10)的“责任”。
- 特点:所有进程的 PSS 值之和,约等于系统总的物理内存占用,PSS 是衡量单个进程对系统内存压力最公平、最准确的指标,当你想知道“杀掉这个进程能释放多少内存”时,PSS 是最好的参考。
USS (Unique Set Size) - 独占集大小
- 定义:进程独有的、不与其他任何进程共享的物理内存大小。
- 通俗理解:这是你房子里完全属于你私人物品的面积,不包括你和室友共用的客厅、厨房。
- 特点:USS 是衡量一个进程“纯粹”内存占用的最小值,如果杀掉这个进程,能释放的内存至少是 USS 值,它对于判断一个进程是否是内存泄漏的元凶非常有帮助。
如何使用 procrank?
基本用法非常简单,只需在命令行中输入 procrank。
procrank
示例输出
PID VSS RSS PSS USS Cgroup UID Command
----- ------ ------ ------ ------ ------ ------ ----------------
1234 456.0M 123.0M 45.6M 12.3M apps 1000 com.example.myapp
5678 234.0M 67.0M 23.4M 5.6M apps 1001 com.another.app
9012 789.0M 345.0M 120.5M 89.0M system 1000 system_server
......
输出列解释
| 列名 | 全称 | 描述 |
|---|---|---|
| PID | Process ID | 进程ID,用于唯一标识一个进程。 |
| VSS | Virtual Set Size | 虚拟内存集大小(单位通常是 KB 或 MB)。 |
| RSS | Resident Set Size | 常驻内存集大小。 |
| PSS | Proportional Set Size | 比例集大小,最重要的指标之一。 |
| USS | Unique Set Size | 独占集大小。 |
| Cgroup | Control Group | 进程所属的 cgroup,在 Android 中通常用于分类(如 apps, system)。 |
| UID | User ID | 运行该进程的用户ID。 |
| Command | Command | 进程的名称或启动命令。 |
procrank 的实际应用场景
定位内存占用大户
当你的手机变得卡顿时,可以运行 procrank,按 PSS 或 RSS 列排序,找出占用内存最多的进程。

# shell 会自动对第一列排序,但也可以手动用 sort procrank | sort -nr -k 3 # 按 RSS (第3列) 降序排列 procrank | sort -nr -k 4 # 按 PSS (第4列) 降序排列
如果发现 system_server 或某个第三方应用的 PSS 异常高,那它就是导致内存紧张、触发后台进程被杀(Low Memory Killer)的元凶。
分析内存泄漏
一个应用如果存在内存泄漏,它的内存占用会随着使用时间的增加而不断攀升,你可以这样做:
- 启动应用并运行
procrank,记录下该进程的 PSS 值。 - 正常使用应用一段时间(比如浏览几个页面)。
- 再次运行
procrank,对比该进程的 PSS 值。 - 退出应用,回到桌面,再次运行
procrank,观察 PSS 值是否回落到接近初始水平。 PSS 值没有明显下降,甚至还在增长,那么很可能存在内存泄漏。
评估优化效果
在进行内存优化后,通过 procrank 可以直观地看到优化效果,你优化了图片加载,减少了内存缓存,在优化前后分别运行 procrank,对比该进程的 PSS/USS 值,如果显著降低,说明优化是有效的。
重要注意事项与替代方案
-
可用性:如前所述,
procrank在大多数非开发版、非 root 的 Android 设备上是不可用的,强行使用会提示command not found。
(图片来源网络,侵删) -
Android 版本:在新版本的 Android (尤其是 Android 5.0 Lollipop 之后) 中,
procrank的使用逐渐减少,被更现代的工具所取代。 -
替代方案:
dumpsys meminfo这是目前 Android 开发中最常用、最推荐 的内存分析工具,无需 root,在 ADB shell 中即可使用。- 查看单个进程:
adb shell dumpsys meminfo <你的包名> - 查看所有进程摘要:
adb shell dumpsys meminfodumpsys meminfo的输出比procrank更详细,除了 PSS、RSS 等指标,还包括了 Dalvik Heap、Native Heap、Ashmem、Gl 等更细分的内存占用,是应用开发者进行内存分析的首选。
- 查看单个进程:
-
替代方案:
procmem一些定制 ROM 或 Root 环境下会提供procmem,功能和procrank类似,但输出格式和侧重点可能略有不同。
| 特性 | procrank |
dumpsys meminfo |
|---|---|---|
| 可用性 | 需要 Root 或开发设备 | 无需 Root,标准 ADB 即可 |
| 主要用途 | 快速概览所有进程的内存占用 | 深入分析单个或所有进程的内存详情 |
| 核心指标 | VSS, RSS, PSS, USS | PSS, RSS, Dalvik Heap, Native Heap 等 |
| 推荐度 | 较低(已过时) | 极高(行业标准) |
procrank 是一个经典且强大的 Android 内存分析工具,能帮助你快速定位问题进程,但在今天,dumpsys meminfo 是更常用、更强大、更易获取的替代方案,如果你是在进行 Android 开发或深度系统分析,请优先使用 dumpsys meminfo。
