内存分析工具:dumpsys meminfo,procrank,smem,top命令详解
做Android内存优化,光懂理论可不行。你得有趁手的工具,才能看到内存到底被谁吃了。
今天我就把这四个最常用的内存分析工具,掰开揉碎了讲给你听。它们各有侧重,配合起来用,基本能覆盖90%的内存排查场景。
核心观点:没有万能工具,只有合适的场景。dumpsys meminfo看全局,procrank看进程细节,smem看共享内存,top看实时变化。
1. dumpsys meminfo:系统级内存快照
这个命令是我用得最多的。为什么?因为它不需要root,任何Android设备都能跑。
adb shell dumpsys meminfo
输出结果会告诉你三件事:
- 总RAM、已用RAM、空闲RAM
- 每个进程的PSS(按比例分摊的物理内存)
- 系统关键区域的内存占用(如内核、ZRAM等)
我的习惯:排查内存泄漏时,先跑一次dumpsys meminfo看总览。如果总内存异常偏高,再用后面的工具深入定位。
想看某个具体进程?加个包名就行:
adb shell dumpsys meminfo com.example.myapp
输出里有个字段叫 Native Heap 和 Dalvik Heap。前者是C/C++分配的内存,后者是Java层的内存。我遇到过好几次,Java堆看起来正常,但Native Heap一直在涨——那八成是JNI层没释放。
2. procrank:进程内存的放大镜
这个工具需要root权限,或者系统是eng版本。但它给的信息,比dumpsys meminfo详细得多。
adb shell procrank
输出长这样(简化版):
PID Vss Rss Pss Uss cmdline
1234 123456K 45678K 23456K 12345K com.example.app
5678 98765K 34567K 18765K 9876K system_server
几个关键指标:
- VSS:虚拟内存大小,基本没用,别管它
- RSS:实际物理内存,包含共享库
- PSS:按比例分摊后的内存,最接近真实占用
- USS:独占物理内存,不包含任何共享部分
注意:procrank在Android 10之后的版本可能被移除。如果找不到,可以用 procmem 替代,或者直接解析 /proc/[pid]/smaps。
我个人习惯用PSS来评估一个App的真实内存开销。为什么?因为RSS会把共享库重复计算,而PSS会按进程数分摊。你想想看,如果两个App都用了同一个so库,RSS会算两次,但PSS只算一次——这才合理嘛。
3. smem:共享内存的照妖镜
smem这个工具,说实话知道的人不多。但它有个绝活:能告诉你共享内存到底被谁用了。
adb shell smem -p
输出会按PSS排序,显示每个进程的内存详情。但smem最牛的地方是 按映射名分组:
adb shell smem -m
这个命令会列出所有共享内存映射,比如:
/dev/ashmem/dalvik-heap— Dalvik堆的共享内存/dev/ashmem/CursorWindow— 数据库游标窗口[anon:libc_malloc]— libc的malloc分配
我曾经遇到一个诡异的问题:某个App的PSS不高,但系统总内存一直在涨。用smem -m一看,发现有个 /dev/ashmem/gralloc_buffer 占了好几百兆,而且没有被正确释放。原来是GPU缓冲区泄漏了。这种问题,你用dumpsys meminfo根本看不出来。
避坑指南:smem在部分设备上可能没有预装。你可以用 adb push 把编译好的smem二进制推到 /data/local/tmp 下运行。
4. top:实时监控的瑞士军刀
top命令大家应该不陌生。但在Android上,它有一些特殊的用法。
adb shell top -m 10 -d 1
参数说明:
-m 10:只显示前10个进程-d 1:每秒刷新一次
输出里有个 RES 列,对应RSS。还有个 %MEM 列,显示内存占比。
top最适合做什么?我一般用它来 观察内存的实时变化。比如你怀疑某个操作会导致内存泄漏,就在操作前后盯着top看。如果某个进程的RES只增不减,那基本可以确定有问题。
实战技巧:把top和logcat配合使用。一边操作App,一边看top的输出。我经常这样定位到「点击某个按钮后,内存暴涨50MB」的bug。
对了,top还有个兄弟叫 htop,界面更友好,但需要额外安装。如果你有root权限,建议装一个。
总结一下这四个工具怎么选
| 场景 | 推荐工具 | 原因 |
|---|---|---|
| 快速查看系统内存状态 | dumpsys meminfo | 无需root,信息全面 |
| 定位哪个进程吃内存 | procrank | PSS/RSS/USS一目了然 |
| 排查共享内存泄漏 | smem | 能看到共享映射的细节 |
| 监控内存实时变化 | top | 动态刷新,适合观察趋势 |
嗯,这四个工具讲完了。其实工具本身不难,难的是知道什么时候用哪个。我刚开始做内存优化时,也是拿着dumpsys meminfo一顿猛看,结果发现数据对不上。后来才明白,不同工具统计口径不一样,得交叉验证。
你只要记住一句话:dumpsys看全局,procrank看进程,smem看共享,top看变化。把这四个工具用熟了,大部分内存问题都逃不过你的眼睛。
公众号:蓝海资料掘金营,微信deep3321