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"


相关推荐
CoderCodingNo2 小时前
【GESP】C++八级考试大纲知识点梳理 (7) 算法的时间和空间效率分析
开发语言·c++·算法
程序员zgh2 小时前
C++ 环形队列 从原理到实例演示
c语言·开发语言·数据结构·c++·学习
csbysj20202 小时前
Bootstrap 下拉菜单:全面解析与应用指南
开发语言
sycmancia2 小时前
Qt——窗口部件及窗口类型、坐标系统
开发语言·qt
zhangren024682 小时前
Laravel5.x版本特性全解析
android·vue.js·spring boot·mysql
2501_915918412 小时前
WebKit 抓包,WKWebView 请求的完整数据获取方法
android·前端·ios·小程序·uni-app·iphone·webkit
南境十里·墨染春水2 小时前
C++ 笔记 运算符重载(面象对象)
开发语言·c++·笔记
小陈工2 小时前
Python Web开发入门(一):虚拟环境与依赖管理,从零搭建纯净开发环境
开发语言·前端·数据库·git·python·docker·开源
EasyControl移动设备管理2 小时前
打破系统壁垒:从 Android 到 macOS,打造全平台统一终端管理(MDM)方案
android·人工智能·物联网·macos·移动设备管理·mdm系统·跨区域设备