内存泄漏--2 性能优化工具MemoryAnalyzer(MAT)内存泄露的简单检测
Posted 彬彬杨
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了内存泄漏--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的引用:
可以发现确实是接口持有对象没释放,和上面的结果一致!
扩展:
内存泄露简单分析到上面就结束了,有时候一个文件也许不能分析出问题,我们可能需要对比分析,怎么做?如下:
将所有需要对比的文件进行上面操作后,点击红色感叹号就可以观察差别了:
对比如下:
好了,以上就是这次介绍的东西了。有什么不对的欢迎指正
以上是关于内存泄漏--2 性能优化工具MemoryAnalyzer(MAT)内存泄露的简单检测的主要内容,如果未能解决你的问题,请参考以下文章
Android 性能优化--内存优化--(内存优化工具内存管理机制内存抖动内存泄漏)
Android 性能优化--内存优化--(内存优化工具内存管理机制内存抖动内存泄漏)
Android 性能优化--内存优化--(内存优化工具内存管理机制内存抖动内存泄漏)