MAT内存泄露分析(一)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MAT内存泄露分析(一)相关的知识,希望对你有一定的参考价值。
参考技术A 使用adb shell dumpsys meminfo pkgname或者直接使用androidStudio里面的memory usage功能然后就会出现如下信息:eclipse中有一个ddms工具,可以查看线程信息(Threads),内存使用情况(VM Heap),内存分配跟踪(Allocation Tracker),CUP使用情况(Sysinfo CUP load),内存使用饼状图(Sysinfo Memory usage),这里我们暂时用到VM Heap,选择要查看的app进程,点击左上角的show heap updates,选择VM Heap并点击Cause GC按钮,然后就出现下图:
观察data object的Total Size选项,这个是app的创建的java对象做占用的内存大小,Count是总内存的对象的个数,反复的进出一个activity,看data object的Total Size有没有明显的增加,正常情况下进入一个activity的时候会明显增加,退出一个activity会有明显的回落,总体是维持在一个比较稳定的水平如果反复进出activity,Total Size不断上升,那么可能就存在内存泄漏了,需要具体排查
内存泄漏--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的引用:
可以发现确实是接口持有对象没释放,和上面的结果一致!
扩展:
内存泄露简单分析到上面就结束了,有时候一个文件也许不能分析出问题,我们可能需要对比分析,怎么做?如下:
将所有需要对比的文件进行上面操作后,点击红色感叹号就可以观察差别了:
对比如下:
好了,以上就是这次介绍的东西了。有什么不对的欢迎指正
以上是关于MAT内存泄露分析(一)的主要内容,如果未能解决你的问题,请参考以下文章
Android常见内存泄露分析及MAT与Profiler内存分析时间
内存泄漏--2 性能优化工具MemoryAnalyzer(MAT)内存泄露的简单检测