跳到主要内容

内存分析工具

问题

如何使用工具分析 Android 应用的内存使用情况?

答案

工具对比

工具特点适用场景
Memory ProfilerAndroid 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: 如何判断是否发生了内存泄漏?

答案

  1. 反复打开关闭某页面
  2. 手动触发 GC(Memory Profiler 中点击垃圾桶图标)
  3. 抓取 Heap Dump
  4. 搜索关闭的 Activity 类名,如果仍有实例存在且 GC Root 可达,则存在泄漏

Q2: Shallow Size 和 Retained Size 的区别?

答案

  • Shallow Size:对象自身占用的内存(不含引用的其他对象)
  • Retained Size:对象被 GC 后能释放的总内存(包含它独占引用的所有对象)

排查泄漏时主要看 Retained Size,它反映释放该对象后的实际收益。

相关链接