Android内存泄漏及检测工具

3,992 阅读3分钟

背景

前几天写了一篇文章关于Android几种常见的内存泄漏问题和解决方法,还没看的朋友也可以先看一下。那么当我们真正遇到不知道问题的内存泄漏的时候该怎么去分析和检测它呢?

内存泄漏检测工具

利用MAT来分析内存泄漏

首先我们就拿一个最简单的内存泄漏的例子来分析一下

public class MainActivity extends Activity {
    private static Context sContext;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        sContext = this;
    }
}

1.首先我们手动出发一下GC然后查看Dump


Android-Monitors.png
Android-Monitors.png

突然发现最新的AndroidStudio没有上面的了,也有可能是我没找到,但是在tools里面有Monitors,打开是下面的界面,也可以导出hprof文件

image.png
image.png

导出之后的文件是不能直接被MAT识别的需要通过hprof-conv命令来转换一下,这个是Android SDK提供的工具,在plafrom-tools目录下

hprof-conv com.aotuman.leak.hprof(原文件) com.aotuman.leak.hprof(输出文件)

然年后我们就可以利用MAT来打开文件进行内存分析了:

image.png
image.png

从图我们可看到MAT提供了很多功能,但是最常用的只有Histogran和Dominator Tree.
Histogran:可以直观的看出内存中不同类型的buffer的数量和占用的内存大小
Dominator Tree:把内存中的对象按照从大到小的顺序进行排序,并且可以分析对象之间的引用关系,内存泄漏分析就是通过他来实现的
下面两张图就是他俩的界面:

Histogran.png
Histogran.png Dominator Tree.png
Dominator Tree.png

那么我们到底应该怎么来查看内存泄漏呢,比如我们的Demo我们大概知道是MainActivity产生了内存泄漏,我们可以搜索,然后按照下图的方式来查看他的引用(在Histogram和Dominator_Tree两个界面都可以这么去查看引用关系):


image.png
image.png

查看完之后我们就会看到这个界面:

image.png
image.png

从图中我们就可以看到,是因为sContext导致了内存泄漏。

利用LeakCanary来查看内存泄漏

这种方式比较简单和直观,有内存泄漏的时候他会之间提示你造成内存泄漏的引用链。 使用方法也很简单:

LeakCancary.png
LeakCancary.png

下面是发生内存泄漏之后,手机上的提示,它会弹出在通知栏。


image.png
image.png

是不是很简单明了,不需要我们自己去分析和查找,只要你是期间出现内存泄漏它都会提示给你。 当然如果有想深入研究的同学可以去Google一下,查看它的源码,分析一下实现原理,这里就不展开了。

总结

以上是我常用的两种方法,如果大家有其他更好的可以留言告诉楼主,我也可以学习一下,总的来说内存泄漏是一个相对较为复杂的问题,但是只要我们掌握了一定的技巧那么解决起来也是很简单的。