MAT(Memory Analyzer Tool)内存泄漏检测

简介

都知道可以使用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存在了内存泄漏;

查看具体内存泄漏点

  1. 进入Dominator Tree,并用包名方式查看


    微信图片编辑_20190806150315.jpg
  2. 找到Main2Activity,然后进行Merge GC Roots操作;


    微信图片编辑_20190806152028.jpg
  3. 可以看到,在Main2Activity泄漏问题中,是因为mMessages的callback有引用到;


    微信截图_20190806152513.png
  4. 查看mMessages的引用者,利用"Show ojects by class - by incoming references"功能,可以查看引用到的对象;

    微信截图_20190806153313.png

  5. 查看引用对象列表,其实可以判断出是Handler导致的内存泄漏;


    微信截图_20190806153758.png

以上

你可能感兴趣的:(MAT(Memory Analyzer Tool)内存泄漏检测)