注:
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最大的类入手分析