第2章:内存分析工具入门
内存分析这事儿,说白了就是给App做体检。你想想看,一个App跑着跑着就卡了,或者直接被系统杀掉,十有八九是内存出了问题。我刚开始做性能优化那会儿,全靠瞎猜,后来才明白——工具在手,心里不慌。
2.1 Android Studio Profiler:最直观的内存监控
这个工具我几乎天天用。它最大的好处就是实时、直观。你一边操作App,一边就能看到内存曲线在跳动。
核心功能:
- 实时内存占用曲线(Java Heap、Native Heap、Code、Stack、Graphics)
- 内存分配追踪(Record Allocation)
- GC事件标记(垃圾回收)
- 对象引用链查看
怎么用?很简单。打开Android Studio,点击底部Profiler标签,选择你的设备和进程。然后点Memory,就能看到实时曲线了。
我的习惯:每次做内存优化前,我都会先录一段完整的操作流程。比如从首页到详情页,再返回,反复几次。这样能清楚看到内存有没有持续增长——如果有,那大概率是内存泄漏。
录完数据后,点一下「Dump Java Heap」,就能拿到当前时刻的堆快照。这时候你可以按类名搜索,看看哪些对象占用了大量内存。我记得有一次排查图片加载问题,就是靠这个功能发现了一个Bitmap没有被回收。
2.2 MAT:深度分析堆转储文件
Android Studio Profiler虽然方便,但真要深挖内存泄漏的根因,还得靠MAT(Memory Analyzer Tool)。它是Eclipse基金会出的,免费、强大。
MAT能做什么?说白了就是帮你分析hprof文件。你从Android Studio导出的堆快照,用MAT打开,它能自动帮你找出「嫌疑对象」。
常用功能:
- Histogram:按类名统计对象数量和占用内存
- Dominator Tree:显示对象之间的引用关系,找出谁占用了最多内存
- Leak Suspects:自动检测内存泄漏嫌疑点
- Path to GC Roots:查看对象到GC Roots的引用链
使用步骤:
- 从Android Studio导出hprof文件(File → Export → Heap Dump)
- 用MAT打开(File → Open Heap Dump)
- 点击「Leak Suspects」查看自动分析结果
- 或者用Histogram手动排查
注意:Android导出的hprof文件不能直接用MAT打开,需要先转换格式。用Android SDK自带的hprof-conv工具:hprof-conv input.hprof output.hprof
我曾经遇到过一个诡异的内存泄漏——一个Activity被销毁后,它的引用还活着。用MAT一查,发现是一个匿名内部类持有了外部Activity的引用。嗯,这就是典型的「内部类泄漏」问题。
2.3 adb shell dumpsys meminfo:命令行快速诊断
有时候你不在电脑前,或者只想快速看一眼内存状态,用命令行最方便。adb shell dumpsys meminfo 就是干这个的。
基本用法:
# 查看所有进程的内存信息
adb shell dumpsys meminfo
# 查看指定包名的内存信息
adb shell dumpsys meminfo com.example.myapp
# 查看详细的内存分类
adb shell dumpsys meminfo -s com.example.myapp
输出结果里,我最关注这几个字段:
| 字段 | 含义 | 正常范围 |
|---|---|---|
| Native Heap | Native层堆内存 | 视业务而定 |
| Dalvik Heap | Java堆内存 | 通常几十MB |
| PSS Total | 实际物理内存占用 | 越少越好 |
| Objects | 对象数量统计 | 关注异常增长 |
小技巧:我经常写一个脚本,每隔5秒自动执行一次dumpsys meminfo,然后对比前后数据。这样能快速发现内存是否在持续增长。比如:while true; do adb shell dumpsys meminfo com.example.myapp | grep "TOTAL"; sleep 5; done
这三个工具各有侧重。Android Studio Profiler适合日常监控,MAT适合深度分析,dumpsys meminfo适合快速诊断。我个人的工作流是:先用Profiler发现问题,再用dumpsys确认,最后用MAT定位根因。
总结一下:
- Profiler:实时监控,适合找「有没有问题」
- MAT:深度分析,适合找「问题在哪」
- dumpsys:快速诊断,适合「看一眼」
下一章,我会带你实战演练——用这些工具找出一个真实的内存泄漏案例。到时候你就知道,工具用好了,优化起来事半功倍。