美文网首页
使用MAT分析内存问题

使用MAT分析内存问题

作者: 碳烤鱼8912 | 来源:发表于2018-08-31 09:33 被阅读0次

     使用MAT分析内存问题

    在开发过程中,我们经常需要分析应用内存,MAT(memory analyzer tool)可以帮助我们轻松分析内存问题。如何使用MAT分析和解决内存问题呢?大致可以按照下面的步骤进行:

    1. 发现内存问题

    2. 分析heap文件

    3. 解决内存问题

    发现内存问题

    发现内存问题的方式有很多种,甚至不借助工具,单纯从用户体验上感觉机器卡顿,都有可能是内存问题导致的。作为开发者自然是需要高端一点,推荐使用Android Device Monitor,在Android sdk/tools/目录下运行命令:

    sudo ./monitor

    可以启动Android Device Monitor。

    手机连接usb,debug调试需要分析的进程:

    选中需要检测的进程,点击“update heap”,然后点击右侧的“Cause GC”,就可以看到java heap的使用情况了:

    在检测的过程中,如果发现此时java heap出现了异常,点击“dump HPROF file”按钮,保存hprof文件。

    分析heap文件

    保存下来的hprof文件是不能被MAT直接识别的,需要做一次转换。

    进入Android sdk/platform-tools/目录,执行如下命令:

    sudo ./hprof-conv original.hprof new.hprof

    转化完成后,使用MAT打开new.hprof,在MAT的Actions中,选择“Histogram”:

    会列出所有的类的引用的内存占用情况:

    为了快速定位内存问题,在搜索栏输入应用的包名,过滤出最可能出问题的对象,比如activity:

    也可以直接搜索“android.graphics.Bitmap”,过滤出Bitmap对象。实际使用过程中灵活运用:

    Activity的引用,一般来说多于一个就是有泄露了,需要重点关注。其他对象,可以根据数量来推测,比如heap中包含了上百个Bitmap对象, 那就有可能是Bitmap不能被释放,这就可能有问题了。

    除了根据数量来判断以外,还可以根据Shallow Heap和Retained Heap的大小来判断。Shallow Heap代表对象本身占用的heap,而Retained Heap代表这个对象被释放后,所能释放的总heap,这就包含了引用该对象的对象。

    实际操作中,可以抓取两个时间点的heap文件,观察对象个数的变化和大小的变化来判断内存的问题所在。当我们找出了可能发生内存泄露的对象,可以右击该对象,选择“List objects”->“with incoming references”。

    1. with incoming references:列出所有包含改引用的对象

    2. with outgoing references:列出改对象包含的所有引用

    我们只关注包含该引用的对象:

    展开列表,再其中一个对象上右击,点击“Merge shortest path to GC roots”->"exclude all phantom/weak/soft etc. references"

    这里会列出强引用此对象的对象,那么既然他持有了该对象的强引用,很有可能就是问题所在:没有及时释放。

    解决内存问题

    看上图的信息,大量的Bitmap对象被com.c.b.m e中的linkhashmap持有,接下就有的放矢的去代码中,找到这个com.c.b.m e,加以分析解决啦。

    MAT的使用就介绍到这里。是不是简单易用呢?

    相关文章

      网友评论

          本文标题:使用MAT分析内存问题

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