ADB ->Android 实时监控内存

Android 实时监控内存:ADB 两种常用方式(轮询 PSS + 按 PID 查看进程占用)

前言

Android 开发中,排查内存问题是非常常见的工作,比如:

  • 页面反复进入退出后内存持续上涨
  • 图片编辑、视频编辑等场景内存波动明显
  • 怀疑 Bitmap、缓存、Native 对象未及时释放
  • 想快速观察某个操作前后的内存变化

除了 Android Studio Profiler,日常开发里更轻量、直接的方式,就是通过 ADB 命令 实时查看应用内存。

本文介绍两种常用方式:

  1. 轮询 dumpsys meminfo 查看 PSS
  2. 通过 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 PSS
  • TOTAL RSS
  • TOTAL 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 PSS
  • TOTAL RSS
  • TOTAL SWAP PSS
  • Native Heap
  • Java 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 meminfotop 更偏向运行时状态,除了内存,也能顺带看 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

输出一次进程列表。

  • -bbatch 模式,适合脚本
  • -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 更适合看 PSS
  • top 更适合看进程实时占用和运行状态

四、两种方式怎么选

如果你想看应用内存是否持续上涨

推荐使用:

bash 复制代码
adb shell dumpsys meminfo

重点关注:

  • TOTAL PSS
  • Java Heap
  • Native Heap

如果你想盯住进程当前占用情况

推荐使用:

bash 复制代码
adb shell top

重点关注:

  • PID
  • RSS/RES
  • CPU%

五、推荐使用方式

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"


相关推荐
九皇叔叔8 分钟前
RHEL9 安装 MySQL 8.4.11.LTS 版本
android·mysql·adb
海兰25 分钟前
【数据库】tdsql(MySQL )的事务隔离级别
android·数据库·mysql
小僧景贤32 分钟前
嵌入式C语言 第十一篇:成长路线|嵌入式C工程师完整进阶学习路径(从零到工程级落地|含周期+实战项目)
c语言·开发语言·学习
哆啦A梦z34 分钟前
Android BLE 实战:从小米手环 7 踩坑到完整连接框架
android
Brilliantwxx37 分钟前
【Linux】自动化构建工具 make 与 Makefile
linux·运维·服务器·开发语言·自动化
灵析表格43 分钟前
Excel连接MySQL的函数化革命:灵析表格MySQL函数族业务应用分析
数据库·mysql·adb·excel·wps·灵析表格·excel公式盒子
灵晔君1 小时前
【Linux】进程(四)——进程虚拟地址空间
linux·c语言·开发语言
萧瑟余晖1 小时前
Java深入解析篇十八之响应式编程
java·开发语言
看浪的路人1 小时前
第5讲:代码审查与 Bug 检测
开发语言·windows·python
netccdn1 小时前
Hough变换检测直线(Matlab)
开发语言·计算机视觉·matlab