内存分析工具:dumpsys meminfo,procrank,smem,top命令详解

做Android内存优化,光懂理论可不行。你得有趁手的工具,才能看到内存到底被谁吃了。

今天我就把这四个最常用的内存分析工具,掰开揉碎了讲给你听。它们各有侧重,配合起来用,基本能覆盖90%的内存排查场景。

核心观点:没有万能工具,只有合适的场景。dumpsys meminfo看全局,procrank看进程细节,smem看共享内存,top看实时变化。

Android 内存分析工具全景 内存分析工具 dumpsys meminfo 全局内存快照 procrank 进程级PSS/RSS smem 共享内存分析 top 实时内存监控 系统级 · 总览 adb shell 直接使用 进程级 · 精确 需root或eng版本 共享内存 · 细节 USS/PSS/RSS全展示 实时 · 动态 CPU+内存一起看 配合使用:dumpsys看整体 → 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 HeapDalvik 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