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 | SELECT * FROM com.example.mat.Listener -- 查询所有Listener |
thread_overview
详细展现出线程信息
Top Consumers
通过饼图的形式展示内存占用信息,其中 Biggest Objects
还会展示大对象的占用信息
Compare_Basket
通过这种方式可以将两次dump信息进行比对,这样就可以知道业务前后那些对象增长异常
Collection Fill Ratio
通过 Collection Fill Ratio
可以查看集合的填充率
如果集合的对象过多且填充率都为0,说明这些集合并没有使用上,可以考虑延迟初始化,在用到的时候再初始化,减少内存占用
【备注一】也可以通过 Array Fill Ratio
来数组分析
【备注二】Map Collision Ratio
哈希碰撞统计,如果哈希碰撞率过多,需要优化相关类的哈希算法