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

时间:2024-04-11 07:16:23

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

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

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

  点开后如图2:

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

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

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

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

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

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

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

 打开MemoryAnalyzer导入文件:性能优化工具2——MemoryAnalyzer(MAT)内存泄露的简单检测

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

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

  

     第二步:分析泄漏

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

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

     该关闭的没关闭,这时候就要看看是哪些地方引用了它们(这里我们排除可以被回收的弱引用和软引用,只查看强引用)性能优化工具2——MemoryAnalyzer(MAT)内存泄露的简单检测

   打开结果如图:

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

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

再去查看类GameTypeTwo的引用:性能优化工具2——MemoryAnalyzer(MAT)内存泄露的简单检测

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

扩展:

内存泄露简单分析到上面就结束了,有时候一个文件也许不能分析出问题,我们可能需要对比分析,怎么做?如下:性能优化工具2——MemoryAnalyzer(MAT)内存泄露的简单检测

将所有需要对比的文件进行上面操作后,点击红色感叹号就可以观察差别了:性能优化工具2——MemoryAnalyzer(MAT)内存泄露的简单检测

对比如下:性能优化工具2——MemoryAnalyzer(MAT)内存泄露的简单检测

好了,以上就是这次介绍的东西了。有什么不对的欢迎指正
————————————————
版权声明:本文为CSDN博主「Else_Q」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qiaoyl113/article/details/78835641