Android 实时监控内存:ADB 两种常用方式(轮询 PSS + 按 PID 查看进程占用)
前言
在 Android 开发中,排查内存问题是非常常见的工作,比如:
- 页面反复进入退出后内存持续上涨
- 图片编辑、视频编辑等场景内存波动明显
- 怀疑
Bitmap、缓存、Native对象未及时释放 - 想快速观察某个操作前后的内存变化
除了 Android Studio Profiler,日常开发里更轻量、直接的方式,就是通过 ADB 命令 实时查看应用内存。
本文介绍两种常用方式:
- 轮询
dumpsys meminfo查看 PSS - 通过 PID 过滤
top查看进程占用
一、先说一个常见误区:grep TOTAL 不等于 TOTAL PSS
很多同学会直接写下面这条命令:
bash
while true; do adb shell dumpsys meminfo com.transsion.mediaeditor | grep TOTAL; sleep 1; done
这条命令可以执行,但这里的:
bash
grep TOTAL
并不是只看 TOTAL PSS,而是会匹配所有包含 TOTAL 的行,比如:
TOTAL PSSTOTAL RSSTOTAL SWAP PSS
所以结论很简单:
grep TOTAL:模糊匹配所有带TOTAL的行grep "TOTAL PSS":精确查看总PSS
如果你的目标是实时看应用 PSS 内存变化,建议直接使用:
bash
grep "TOTAL PSS"
二、方式一:轮询 dumpsys meminfo,实时查看 PSS
这种方式最常用,适合看 App 总体内存趋势。
1. 单次查看内存信息
bash
adb shell dumpsys meminfo com.transsion.mediaeditor
这条命令会输出当前应用的内存信息,常见重点项包括:
TOTAL PSSTOTAL RSSTOTAL SWAP PSSNative HeapJava Heap
其中最常用于观察内存趋势的是:
TOTAL PSS
它更适合衡量应用实际内存占用成本,也是日常排查里最常关注的指标。
2. Git Bash 实时轮询 TOTAL PSS
bash
while true; do
printf "[%s] " "$(date '+%H:%M:%S')"
adb shell dumpsys meminfo com.transsion.mediaeditor | tr -d '\r' | grep "TOTAL PSS"
sleep 1
done
3. 命令说明
while true; do ... done
表示无限循环,持续执行命令。
printf "[%s] " "$(date '+%H:%M:%S')"
打印当前时间,方便和你的操作步骤对齐。
adb shell dumpsys meminfo com.transsion.mediaeditor
查看目标应用的内存信息。
tr -d '\r'
在 Git Bash 环境下,ADB 输出有时会带回车符,先清理掉更稳妥。
grep "TOTAL PSS"
只保留 TOTAL PSS 这一项,避免被其他 TOTAL 信息干扰。
sleep 1
每 1 秒采样一次。
4. 输出示例
bash
[14:20:01] TOTAL PSS: 245678 TOTAL RSS: 312456 TOTAL SWAP PSS: 1024
[14:20:02] TOTAL PSS: 246120 TOTAL RSS: 313000 TOTAL SWAP PSS: 1024
[14:20:03] TOTAL PSS: 248500 TOTAL RSS: 315200 TOTAL SWAP PSS: 1200
通过这个输出,可以快速观察:
- 内存是否持续上涨
- 某次操作后是否明显增加
- 释放后是否回落
5. 如果想同时看几个关键指标
bash
while true; do
echo "[$(date '+%H:%M:%S')]"
adb shell dumpsys meminfo com.transsion.mediaeditor | tr -d '\r' | grep -E "TOTAL PSS|TOTAL RSS|TOTAL SWAP PSS|Native Heap|Java Heap"
echo "--------------------------"
sleep 1
done
适合进一步判断:
- 是
Java Heap在涨 - 还是
Native Heap在涨 - 还是整体
RSS在变大
三、方式二:通过 PID 过滤 top,查看进程占用
第二种方式适合从进程视角观察资源占用情况。
相比 dumpsys meminfo,top 更偏向运行时状态,除了内存,也能顺带看 CPU。
1. 先获取进程号 PID
优先推荐:
bash
adb shell pidof -s com.transsion.mediaeditor
如果设备不支持 pidof,也可以使用:
bash
adb shell ps -A | grep com.transsion.mediaeditor
2. 实时按 PID 过滤查看
bash
while true; do
PID=$(adb shell pidof -s com.transsion.mediaeditor | tr -d '\r')
echo "[$(date '+%H:%M:%S')] PID=$PID"
if [ -n "$PID" ]; then
adb shell top -b -n 1 | tr -d '\r' | grep -E "PID|[[:space:]]$PID[[:space:]]"
else
echo "process not found"
fi
echo "--------------------------"
sleep 1
done
3. 命令说明
PID=$(adb shell pidof -s com.transsion.mediaeditor | tr -d '\r')
获取当前应用进程号。
adb shell top -b -n 1
输出一次进程列表。
-b:batch模式,适合脚本-n 1:只输出一次
grep -E "PID|[[:space:]]$PID[[:space:]]"
保留表头和目标 PID 所在行,方便只看指定进程。
if [ -n "$PID" ]
判断当前进程是否存在,避免应用退出时报错。
4. 这种方式适合看什么
top 通常可以看到这些信息:
PID:进程号CPU%:CPU 占用RSS/RES:常驻内存VSS/VIRT:虚拟内存NAME:进程名
需要注意的是:
top里看到的通常是RSS/RES,不是PSS
所以:
dumpsys meminfo更适合看PSStop更适合看进程实时占用和运行状态
四、两种方式怎么选
如果你想看应用内存是否持续上涨
推荐使用:
bash
adb shell dumpsys meminfo
重点关注:
TOTAL PSSJava HeapNative Heap
如果你想盯住进程当前占用情况
推荐使用:
bash
adb shell top
重点关注:
PIDRSS/RESCPU%
五、推荐使用方式
1. 看内存趋势:用 dumpsys meminfo
bash
while true; do
printf "[%s] " "$(date '+%H:%M:%S')"
adb shell dumpsys meminfo com.transsion.mediaeditor | tr -d '\r' | grep "TOTAL PSS"
sleep 1
done
2. 看进程实时占用:用 top + PID
bash
while true; do
PID=$(adb shell pidof -s com.transsion.mediaeditor | tr -d '\r')
echo "[$(date '+%H:%M:%S')] PID=$PID"
if [ -n "$PID" ]; then
adb shell top -b -n 1 | tr -d '\r' | grep -E "PID|[[:space:]]$PID[[:space:]]"
else
echo "process not found"
fi
echo "--------------------------"
sleep 1
done
六、总结
Android 实时监控内存,命令行下最常用的就是这两种方式:
方式一:轮询 dumpsys meminfo
适合看 PSS 趋势
bash
while true; do
printf "[%s] " "$(date '+%H:%M:%S')"
adb shell dumpsys meminfo com.transsion.mediaeditor | tr -d '\r' | grep "TOTAL PSS"
sleep 1
done
方式二:通过 PID 过滤 top
适合看 进程实时占用
bash
while true; do
PID=$(adb shell pidof -s com.transsion.mediaeditor | tr -d '\r')
echo "[$(date '+%H:%M:%S')] PID=$PID"
if [ -n "$PID" ]; then
adb shell top -b -n 1 | tr -d '\r' | grep -E "PID|[[:space:]]$PID[[:space:]]"
else
echo "process not found"
fi
echo "--------------------------"
sleep 1
done
最后再强调一次:
grep TOTAL不是严格意义上的TOTAL PSS。如果要精确监控 PSS,请直接使用
grep "TOTAL PSS"。