菜鸟科技网

procrank命令如何查看进程内存占用排名?

什么是 procrank

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

procrank命令如何查看进程内存占用排名?-图1
(图片来源网络,侵删)

重要提示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,按 PSSRSS 列排序,找出占用内存最多的进程。

procrank命令如何查看进程内存占用排名?-图2
(图片来源网络,侵删)
# shell 会自动对第一列排序,但也可以手动用 sort
procrank | sort -nr -k 3 # 按 RSS (第3列) 降序排列
procrank | sort -nr -k 4 # 按 PSS (第4列) 降序排列

如果发现 system_server 或某个第三方应用的 PSS 异常高,那它就是导致内存紧张、触发后台进程被杀(Low Memory Killer)的元凶。

分析内存泄漏

一个应用如果存在内存泄漏,它的内存占用会随着使用时间的增加而不断攀升,你可以这样做:

  1. 启动应用并运行 procrank,记录下该进程的 PSS 值。
  2. 正常使用应用一段时间(比如浏览几个页面)。
  3. 再次运行 procrank,对比该进程的 PSS 值。
  4. 退出应用,回到桌面,再次运行 procrank,观察 PSS 值是否回落到接近初始水平。 PSS 值没有明显下降,甚至还在增长,那么很可能存在内存泄漏。

评估优化效果

在进行内存优化后,通过 procrank 可以直观地看到优化效果,你优化了图片加载,减少了内存缓存,在优化前后分别运行 procrank,对比该进程的 PSS/USS 值,如果显著降低,说明优化是有效的。


重要注意事项与替代方案

  1. 可用性:如前所述,procrank 在大多数非开发版、非 root 的 Android 设备上是不可用的,强行使用会提示 command not found

    procrank命令如何查看进程内存占用排名?-图3
    (图片来源网络,侵删)
  2. Android 版本:在新版本的 Android (尤其是 Android 5.0 Lollipop 之后) 中,procrank 的使用逐渐减少,被更现代的工具所取代。

  3. 替代方案:dumpsys meminfo 这是目前 Android 开发中最常用、最推荐 的内存分析工具,无需 root,在 ADB shell 中即可使用。

    • 查看单个进程adb shell dumpsys meminfo <你的包名>
    • 查看所有进程摘要adb shell dumpsys meminfo dumpsys meminfo 的输出比 procrank 更详细,除了 PSS、RSS 等指标,还包括了 Dalvik Heap、Native Heap、Ashmem、Gl 等更细分的内存占用,是应用开发者进行内存分析的首选。
  4. 替代方案: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

分享:
扫描分享到社交APP
上一篇
下一篇