top 命令是一个实时、动态的进程监控工具,它类似于 Windows 任务管理器或 macOS 的活动监视器,可以让你直观地看到当前系统中正在运行的进程及其资源占用情况,这对于分析应用性能、定位内存泄漏、排查 ANR (Application Not Responding) 问题等至关重要。

如何进入 top 命令
你通常通过 adb (Android Debug Bridge) 连接到设备或模拟器来使用 top 命令。
-
确保设备已连接并启用 ADB 调试模式。
-
打开终端或命令行工具。
-
执行以下命令进入交互式
top界面:
(图片来源网络,侵删)adb shell top
进入后,你会看到一个类似下面这样的界面,并且会实时刷新:
User 0, PID 12345
100% 15% 12345 com.android.systemui S 0 12345 6000 450000 1000000 S 0.0% 0.0% 0.0% Foreground
80% 10% 12346 com.example.myapp R 0 12346 7000 500000 1200000 R 5.0% 2.0% 1.0% MyApp
50% 5% 12347 com.android.phone S 0 12347 5000 400000 900000 S 0.0% 0.0% 0.0% Phone
30% 2% 12348 adbd S 0 12348 3000 350000 800000 S 0.0% 0.0% 0.0% adbd
...
top 命令输出详解
我们来逐行解析上面的输出示例。
第一行:标题行
User 0, PID 12345
User 0: 表示当前查看的是用户为root或shell的进程,在 Android 中,普通应用运行在独立的用户空间下。PID 12345: 这是你当前选中的进程的 进程ID (Process ID),在交互模式下,你可以按s键来指定监控某个特定 PID。
数据行:每个进程的信息
100% 15% 12345 com.android.systemui S 0 12345 6000 450000 1000000 S 0.0% 0.0% 0.0% Foreground
我们来分解这一列:
| 列 | 含义 | 示例值 | 说明 |
|---|---|---|---|
| CPU% | CPU 总使用率 | 100% |
该进程及其所有线程占用的 所有 CPU 核心 的总使用率,如果你的设备是 8 核的,那么单个核心跑到 100% 也只显示 12.5%。 |
| CPU% (单核) | 单核 CPU 使用率 | 15% |
该进程在 单个 CPU 核心 上的使用率,这个值在多核设备上更有参考价值,能看出进程是否在某个核心上疯狂占用。 |
| PID | 进程 ID | 12345 |
系统中每个进程的唯一标识符。 |
| Name | 进程名 | com.android.systemui |
进程的名称,通常是应用的包名。 |
| State | 进程状态 | S |
R (Running): 正在运行或准备运行。S (Sleeping): 可中断的休眠状态(等待事件)。D (Uninterruptible Sleep): 不可中断的休眠(通常在 I/O 操作)。Z (Zombie): 僵尸进程(已结束但父进程未回收)。 |
| VSS | 虚拟内存集 | 0 |
进程虚拟地址空间的总大小,包括代码、数据、共享库等。这个值通常很大,参考意义有限。 |
| RSS | 常驻内存集 | 6000 |
进程实际物理内存的占用大小(单位通常是 KB),这个值比 VSS 更能反映进程对内存的真实“压榨”程度。 |
| PSS | Proportional Set Size | 450000 |
极其重要的内存指标,它将共享库的内存按比例地分摊到每个使用它的进程中。PSS = RSS1 + (共享库1大小 * 进程权重) + ...,这是衡量一个进程内存占用的 最公平、最准确 的指标。 |
| USS | Unique Set Size | 1000000 |
进程独占的物理内存大小,这部分内存只有该进程能使用,即使进程被杀死,这部分内存也能被立刻回收,USS 是衡量进程自身内存消耗的最直接指标,但系统不直接提供此列,需通过 procrank 等工具查看。 |
| PCY | 调度优先级/类别 | S |
表示进程的调度类别。S 代表普通进程,F 代表前台进程,T 代表顶级进程(具有更高的优先级)。 |
| THR | 线程数 | 0% |
该进程包含的线程数量。 |
| #WQ | 等待线程数 | 0% |
等待 I/O 操作完成的线程数。 |
| Name ( | 进程名 | Foreground |
进程的名称,有时会显示更友好的描述。 |
常用交互式命令
在 top 命令的交互界面下,你可以按一些键来改变显示内容和行为:

| 命令 | 功能 |
|---|---|
q |
退出 top 命令。 |
m |
按内存排序,默认情况下,top 是按 CPU 使用率排序的,按 m 后会按 PSS(内存)从高到低排序,这对于查找内存大户非常有用。 |
s |
刷新时间间隔,按 s 后可以输入一个数字来设置刷新间隔(单位为秒),例如输入 5,则每 5 秒刷新一次,按回车确认。 |
r |
renice 进程,重新设置某个进程的优先级,需要输入 PID 和优先级值(-20 到 19,值越小优先级越高),普通用户通常无法使用。 |
k |
杀死进程,输入要杀死的进程 PID,然后输入信号(通常是 9 强制杀死)。 |
d 或 s |
同 s 命令,设置刷新延迟。 |
o |
添加/删除列,可以自定义显示哪些列。 |
f |
同 o 命令,字段编辑。 |
t |
切换 CPU 列,在显示单个核心 CPU 使用率和所有核心总使用率之间切换。 |
p |
切换进程/线程视图,在显示进程信息和线程信息之间切换。 |
实际应用场景
场景 1:定位 ANR (Application Not Responding) 问题
ANR 的根本原因是 主线程(UI 线程)被阻塞了超过 5 秒(按键事件)或 10 秒(输入事件)。
- 当 ANR 发生时,设备通常会弹出对话框,不要点击任何东西。
- 在另一台电脑上,通过
adb shell top连接设备。 - 查找你的应用包名(
com.example.myapp)。 - 观察该进程的 State 列,如果它长时间处于
R(Running) 状态,CPU 使用率很高,说明它可能在执行一个耗时的计算任务。 - State 列是
S(Sleeping),但主线程就是没有被唤醒处理 UI 事件,那么问题可能出在某个wait()或lock()调用上,导致线程无法继续执行。 - 结合
logcat查看输出的 ANR trace 文件,可以精确定位到是哪一行代码阻塞了主线程。
场景 2:发现内存泄漏
内存泄漏是指对象不再被使用,但由于错误的引用关系,导致 GC(垃圾回收器)无法回收它们,从而造成内存占用持续增长。
- 启动你的应用。
- 在应用中执行一系列可能导致内存泄漏的操作(跳转页面、打开/关闭对话框等)。
- 在后台持续运行
adb shell top -m 20(-m表示只显示内存占用最高的前 N 个进程)。 - 观察你的应用进程的 PSS 值,正常情况下,在执行完操作后,内存应该会回落到一个稳定的基线水平,PSS 值只增不减,那么很可能存在内存泄漏。
- 结合 Android Studio 的 Memory Profiler,可以捕获内存快照,并通过比较快照来找出具体是哪些对象没有被回收。
场景 3:监控 CPU 占用率
如果发现设备发热严重或卡顿,可以查看是哪个进程占用了大量 CPU。
- 运行
adb shell top。 - 默认按 CPU 使用率排序,找到占用率最高的进程。
- 如果是你的应用,说明它可能在后台执行了非常耗时的计算任务,或者存在性能瓶颈的代码(在主线程进行了网络请求、复杂的 UI 绘制、大量数据计算等)。
相关和替代命令
adb shell ps:top的静态版本,只显示当前进程的快照,不刷新,用于一次性查看所有进程。adb shell procrank: 一个更强大的内存分析工具,会显示每个进程的 USS (Unique Set Size),这是衡量进程自身内存消耗最准确的指标,但它在新版本的 Android 中可能已被移除。adb shell dumpsys meminfo <package_name>: 极其重要的命令,它会打印出指定应用的详细内存信息,包括 PSS、对象数量、视图层次、已加载的类等,是分析内存问题的利器。adb shell dumpsys cpuinfo: 查看 CPU 占用情况,可以按进程或服务分类统计。
top 命令是 Android 开发者必备的命令行工具之一,它简单、直接、高效,能让你快速掌握设备的运行状态,熟练掌握 top 的使用,特别是对 CPU% 和 PSS 列的解读,将极大地提升你排查性能问题的能力。
