简介
都知道可以使用MAT来进行内存泄漏检测,可是一旦落实到hprof文件中显示出来的字段海洋,又显得无从下手。所以必须要有一目标,目标越精确越好。
一个应用可能包含了几十个Module,上百个Activity等情况,显然丢过来一个随便抓是hprof文件来分析内存泄漏,基本不太可能;真想要进行分析需要定位单个目标,不如某个让你怀疑的Activity。
判断内存泄漏步骤
1. dump合理的hprof文件,并用MAT打开
1.1. 确定怀疑目标:Main2Activity;
1.2. 进入Main2Activity之前,dump第一个hprof文件,命名first.hprof;
1.3. 进入Main2Activity,进行一定的操作,比如滑动之类,但是最好不要跳转离开页面;
1.4. 关闭Main2Activity,dump第二个hprof文件,命名second.hprof;
1.5. 使用AMT打开first.hprof和second.hprof; 如下图
微信截图_20190806143849.png
2. 使用Histogram和Dominator Tree对比分析这两个Hprof文件
2.1 进入Histogram页面;
微信截图_20190806144713.png
2.2 点击上图第二个hprof的比较按钮,会触发 “Compare to another Heap Dump”
微信截图_20190806145050.png
2.3 进入比较页面,同时输入你怀疑的对象
微信截图_20190806145544.png
2.4 如上图,在两个hprof文件比较之后,Main2Activity多了一点内存占用,说明Main2Activty存在了内存泄漏;
查看具体内存泄漏点
-
进入Dominator Tree,并用包名方式查看
微信图片编辑_20190806150315.jpg -
找到Main2Activity,然后进行Merge GC Roots操作;
微信图片编辑_20190806152028.jpg -
可以看到,在Main2Activity泄漏问题中,是因为mMessages的callback有引用到;
微信截图_20190806152513.png -
查看mMessages的引用者,利用"Show ojects by class - by incoming references"功能,可以查看引用到的对象;
微信截图_20190806153313.png
-
查看引用对象列表,其实可以判断出是Handler导致的内存泄漏;
微信截图_20190806153758.png
网友评论