MAT常见泄漏Problem Suspect解析

本文来讲一下如何使用MAT分析并定位泄漏的项目源码位置

一.使用leak suspects report排查泄漏疑点。

1.导入.hprof文件后会有如下弹框
MAT常见泄漏Problem Suspect解析_第1张图片
2.选择第一项查看内存泄漏疑点报告,就会自动展示出可能造成泄漏的疑点:
MAT常见泄漏Problem Suspect解析_第2张图片
首先要清楚一点,图片中列出的Problem Suspect 1、2…只是怀疑,并不确定,我们需要查看这些怀疑项来确认是否造成了泄漏。
3.点击每个疑点底部的details链接跳转到详情,如下
MAT常见泄漏Problem Suspect解析_第3张图片
或者
MAT常见泄漏Problem Suspect解析_第4张图片
从详情中可以看到类似@ 0x11111111的内容,代表实例对象的编号,复制一个

4.通过编号搜索调用栈:
MAT常见泄漏Problem Suspect解析_第5张图片
点击ok出现如下调用栈:
MAT常见泄漏Problem Suspect解析_第6张图片
在里面查找项目里相关代码引用即可,没有引用就是项目没有造成这个怀疑的泄漏。

二.使用OQL排查

1.点击下图中1标记的图标打开OQL窗口,在2中位置输入查询的类路径,点击3中图标执行查询操作,如果有结果就会在下面出现对应类:
MAT常见泄漏Problem Suspect解析_第7张图片
2.查看此对象被引用的位置
右键class对象,选择如下选项,exclude weak/soft 排除弱引用和软引用是因为二者都有大几率被gc回收掉。
MAT常见泄漏Problem Suspect解析_第8张图片
出现如下调用栈:
在这里插入图片描述
即可确认对象正被引用的位置。

3.使用Histogram查找对象

1.点击下图中1位置图标会打开Histogram窗口,此窗口展示了所有在使用的class

MAT常见泄漏Problem Suspect解析_第9张图片
可以在此界面直接输入要查询的class来查找,如下:
MAT常见泄漏Problem Suspect解析_第10张图片
查看调用栈的方法和前面相同。

一些常见泄漏:

1.169 instances of “android.graphics.Bitmap”, loaded by “” occupy 15,296,280 (43.88%) bytes.
这个问题是因为使用Glide加载图片时Glide.with(MainActivity.this),这里应该使用ApplicationContext代替Activity的上下文,因为加载网络图片是异步的。

你可能感兴趣的:(android,性能优化)