Memory Analyzer

Memory Analyzer

俗称MAT,强大的 Java Heap 分析工具,较于 Memory Profiler 更适合查找内存泄漏及内存占用

建议线下深入使用

工具地址

官方文档

使用

获取内存文件:dump 内存的几种方式

dump 出来的内存文件 MAT 都无法直接使用,需要通过 hprof-conv 工具对 Dump 文件进行转换

工具目录:<Android_SDK>/platform-tools/

1
hprof-conv dump.hprof <输出目录>/<文件名>.hprof

常用功能

Histogram
  • 顶部支持过滤
  • with outgoing references:它强引用了谁
  • with incoming references:它被谁强引用
  • 查看引用链:子选项为需要排除的对象
dominator_tree

Histogram 功能类似,但是它会显示出具体对象和对象占用内存的百分比,而 Histogram 只会显示具体数量

OQL

对象查询语言,类似于从数据库检索东西。类作为表,object 作为行,field 字段作为列

1
2
3
4
5
SELECT * FROM com.example.mat.Listener -- 查询所有Listener

SELECT toString(l.message), l.message.count FROM com.example.mat.Listener l -- 查询Listener里的message和数量

SELECT toString(s), s.count FROM java.lang.String s WHERE (toString(s) NOT LIKE "msg*") -- 查询不包含msg的字串

thread_overview

详细展现出线程信息

Top Consumers

通过饼图的形式展示内存占用信息,其中 Biggest Objects 还会展示大对象的占用信息

Compare_Basket

通过这种方式可以将两次dump信息进行比对,这样就可以知道业务前后那些对象增长异常

Collection Fill Ratio

通过 Collection Fill Ratio 可以查看集合的填充率

如果集合的对象过多且填充率都为0,说明这些集合并没有使用上,可以考虑延迟初始化,在用到的时候再初始化,减少内存占用

【备注一】也可以通过 Array Fill Ratio 来数组分析

【备注二】Map Collision Ratio 哈希碰撞统计,如果哈希碰撞率过多,需要优化相关类的哈希算法