内存泄漏--2 性能优化工具MemoryAnalyzer(MAT)内存泄露的简单检测

     以下用MemoryAnalyzer对内存泄漏的检测作简单介绍:

     首先androidStudio自带Memory Monitor可以分析内存泄漏问题,方法如下,当我们执行了一系列操作后点击垃圾回收(需要先进行垃圾回收,这样才能发现那些该回收的类没有被回收掉)然后就可以点击 dump java heap 进行分析了:

  

 

  点开后如图2:

   

 

  如上class name下,我们可以简单的查看自己的类的一些,比如你输入“mainactivity”发现它的heap count有2个,这一般来讲就不正常了。

  analyzer tasks 可以自动帮你分析那些地方可能泄露

  下面的tree 可以查看一些引用关系。

  关于jump java heap 不多说,自己查资料看,我是觉得analyzer tasks达不到我的要求。接下来讲讲怎么简单使用MAT

  第一步:导出MemoryAnalyzer可以查看的文件

  

 

 打开MemoryAnalyzer导入文件:

 

这里我们可以先点击一下leak suspects,这是系统分析出来可能存在泄漏的地方,一般我们的一些activity被持有什么的都可以从这里直接看到。

         

 

  

     第二步:分析泄漏

      在这之前首先要注意一点,我们这个文件是要在点击垃圾回收后生成的。简单的说比如:我们依次打开了A-B-C三个activity,随后关闭了B和C,垃圾回收后发现已经不再使用的B和C还存在,这就说明可能发生了泄漏。(假如先调用垃圾回收的话,B和C的存在就不能说明发生了泄漏)

    

 

     该关闭的没关闭,这时候就要看看是哪些地方引用了它们(这里我们排除可以被回收的弱引用和软引用,只查看强引用)

 

   打开结果如图:

   

 

这下找到了原因了,解释一下:由于findit这个对象下的接口mainEventListen持有GameTypeTwo这个对象,所以GameTypeTwo无法释放。而GameTypeTwo又引用了QuestionLook的实例questionBeans(请忽略这里的命名不规范问题),所以导致了最后这几个类都无法释放。so easy!

再去查看类GameTypeTwo的引用:

 

可以发现确实是接口持有对象没释放,和上面的结果一致!

扩展:

内存泄露简单分析到上面就结束了,有时候一个文件也许不能分析出问题,我们可能需要对比分析,怎么做?如下:

 

将所有需要对比的文件进行上面操作后,点击红色感叹号就可以观察差别了:

 

对比如下:

 

好了,以上就是这次介绍的东西了。有什么不对的欢迎指正
 

Guess you like

Origin blog.csdn.net/yangbin0513/article/details/121038881