美文网首页Android内存泄露
内存分析—MAT详细操作

内存分析—MAT详细操作

作者: 青禾tester | 来源:发表于2017-04-28 09:53 被阅读0次

    注:

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

    相关文章

      网友评论

        本文标题:内存分析—MAT详细操作

        本文链接:https://www.haomeiwen.com/subject/xgsozttx.html