内存分析工具
问题
如何使用工具分析 Android 应用的内存使用情况?
答案
工具对比
| 工具 | 特点 | 适用场景 |
|---|---|---|
| Memory Profiler | Android Studio 内置 | 实时监控、快速 Heap Dump |
| LeakCanary | 自动检测泄漏 | 开发期泄漏检测 |
| MAT | 深入分析 Heap Dump | 复杂泄漏分析 |
| dumpsys meminfo | 命令行 | 快速查看内存概况 |
| Perfetto | 系统级追踪 | GC 频率、内存趋势 |
dumpsys meminfo
adb shell dumpsys meminfo com.example.app
# 关键字段
# Java Heap: Java/Kotlin 对象
# Native Heap: JNI 分配、Bitmap(8.0+)
# Graphics: GPU 纹理
# TOTAL: 总内存
# 输出示例:
# App Summary
# Pss(KB)
# Java Heap: 25,680
# Native Heap: 18,432
# Code: 8,960
# Stack: 1,024
# Graphics: 12,288
# TOTAL: 72,384
Heap Dump 分析流程
MAT 使用要点
将 Android hprof 转换为 MAT 格式:
# Android Studio 的 hprof 需要转换
hprof-conv android.hprof mat.hprof
MAT 关键功能:
- Histogram:按类统计实例数和内存占用
- Dominator Tree:查看谁"支配"了最多内存
- Leak Suspects:自动分析可能的泄漏
- OQL(Object Query Language):SQL 风格查询对象
-- MAT OQL 查找所有 Activity 实例
SELECT * FROM instanceof android.app.Activity
常见面试问题
Q1: 如何判断是否发生了内存泄漏?
答案:
- 反复打开关闭某页面
- 手动触发 GC(Memory Profiler 中点击垃圾桶图标)
- 抓取 Heap Dump
- 搜索关闭的 Activity 类名,如果仍有实例存在且 GC Root 可达,则存在泄漏
Q2: Shallow Size 和 Retained Size 的区别?
答案:
- Shallow Size:对象自身占用的内存(不含引用的其他对象)
- Retained Size:对象被 GC 后能释放的总内存(包含它独占引用的所有对象)
排查泄漏时主要看 Retained Size,它反映释放该对象后的实际收益。