MAT常见泄漏Problem Suspect解析
本文来讲一下如何使用MAT分析并定位泄漏的项目源码位置
一.使用leak suspects report排查泄漏疑点。
1.导入.hprof文件后会有如下弹框
2.选择第一项查看内存泄漏疑点报告,就会自动展示出可能造成泄漏的疑点:
首先要清楚一点,图片中列出的Problem Suspect 1、2…只是怀疑,并不确定,我们需要查看这些怀疑项来确认是否造成了泄漏。
3.点击每个疑点底部的details链接跳转到详情,如下
或者
从详情中可以看到类似@ 0x11111111的内容,代表实例对象的编号,复制一个
4.通过编号搜索调用栈:
点击ok出现如下调用栈:
在里面查找项目里相关代码引用即可,没有引用就是项目没有造成这个怀疑的泄漏。
二.使用OQL排查
1.点击下图中1标记的图标打开OQL窗口,在2中位置输入查询的类路径,点击3中图标执行查询操作,如果有结果就会在下面出现对应类:
2.查看此对象被引用的位置
右键class对象,选择如下选项,exclude weak/soft 排除弱引用和软引用是因为二者都有大几率被gc回收掉。
出现如下调用栈:
即可确认对象正被引用的位置。
3.使用Histogram查找对象
1.点击下图中1位置图标会打开Histogram窗口,此窗口展示了所有在使用的class
可以在此界面直接输入要查询的class来查找,如下:
查看调用栈的方法和前面相同。
一些常见泄漏:
1.169 instances of “android.graphics.Bitmap”, loaded by “” occupy 15,296,280 (43.88%) bytes.
这个问题是因为使用Glide加载图片时Glide.with(MainActivity.this),这里应该使用ApplicationContext代替Activity的上下文,因为加载网络图片是异步的。