Android内存泄露

内存分析—MAT详细操作

2017-04-28  本文已影响0人  青禾tester

注:

MAT查看到的内容不一定是内存泄露,需要具体分析。

使用MAT分析,最好能提前定位可能出现内存泄露的类,然后借助MAT确认是否出现泄露;优先看retained heap 较大的类分析。

提前准备:

1、下载MAT(Memory Analyzer Tool)

2、准备标准HPROF文件(Heap/CPU Profiling)

MAT下载地址:

https://eclipse.org/mat/downloads.php

如本地没有安装eclipse,下载独立包(stand-alone);

如本地安装eclipse,把插件url添加到eclipse里在线安装。

如下均使用MAT独立版操作。

1、打开MAT

界面如下:

2、打开HPROF文件

(1)file–open file–对应路径下找到hprof文件,点击打开

(2)MAT界面弹出引导,如下图

(3)选择Leak Suspects Report (当前关注点为检测是否出现泄露)

3、OQL 查找

(1)打开OQL

OQL语法,类似SQL语句

(2)查找所有的Activity实例

输入:select * from instanceof android.app.Activity

(还要其他指令用法,如怀疑某一activity可能有问题,输入:select * from com.xxx.xx.ui.MainActivity)

检索结果如下图:

4、排除非强引用

Strong Ref(强引用):通常我们编写的代码都是Strong Ref,于此对应的是强可达性,只有去掉强可达,对象才被回收。

Soft Ref(软引用):对应软可达性,只要有足够的内存,就一直保持对象,直到发现内存吃紧且没有Strong Ref时才回收对象。一般可用来实现缓存,通过java.lang.ref.SoftReference类实现。

Weak Ref(弱引用):比Soft Ref更弱,当发现不存在Strong Ref时,立刻回收对象而不必等到内存吃紧的时候。通过java.lang.ref.WeakReference和java.util.WeakHashMap类实现。

Phantom Ref(虚引用):根本不会在内存中保持任何对象,你只能使用Phantom Ref本身。一般用于在进入finalize()方法后进行特殊的清理过程,通过 java.lang.ref.PhantomReference实现。

(1)检索结果中有两个WebViewActivity,可能有泄露

(2)右键Merge Shortest Path to GC Roots,可选择exclude weak reference(排除弱引用)、或者exclude phantom/weak/soft reference(排除软/弱/虚引用)

(3)排除非强引用,结果如下

分析:最底部WebViewActivity被上一级mcontext对象持有,无法释放。(代码中查看下,这里可能是问题,也可能并不是问题)

5、其他MAT常用功能,后续补充

另一种内存泄露分析思路:

查看Dominator Tree,从Retained Heap最大的类入手分析

上一篇 下一篇

猜你喜欢

热点阅读