[聚合文章] LeakCanary原理浅析

消息系统 2017-12-19 17 阅读

LeakCanary原理浅析

1.LeakCanary简介

LeakCanary是一个Android和Java的内存泄漏检测库,可以大幅可以大幅度减少了开发中遇到的OOM问题。

LeakCanary开源库的地址为:

LeakCanary开源库

LeakCanary的README地址如下:

LeakCanary的README

2.如何使用LeakCanary

使用LeakCanary非常简单,只需要在Application的onCreate()方法里面调用LeakCanary.install(this)方法,就像下面一样:

public class ExampleApplication extends Application {    @Override     public void onCreate() {        super.onCreate();        // 如果是在HeapAnalyzer进程里,则返回,因为该进程是专门用来堆内存分析的。        if (LeakCanary.isInAnalyzerProcess(this)) {            // This process is dedicated to LeakCanary for heap analysis.            // You should not init your app in this process.            return;        }        //调用LeakCanary.install()的方法来进行必要的初始化工作,来监听内存泄漏。        LeakCanary.install(this);        // Normal app init code...    }}

如果只想检测Activity的内存泄漏,而且只想使用默认的报告方式,则只需按照上面的实例,在Application里面添加一行代码:

LeakCanary.install(this);

如果想监控Fragment等其他有生命周期函数的方法的类是否有内存泄漏时,可以先返回一个RefWatcher对象,然后通过RefWatcher监控那些本该被回收的对象。使用示例如下:

public class ExampleApplication extends Application {    public static RefWatcher getRefWatcher(Context context) {        ExampleApplication application = (ExampleApplication) context.getApplicationContext();        return application.refWatcher;    }    private RefWatcher refWatcher;    @Override public void onCreate() {        super.onCreate();        refWatcher = LeakCanary.install(this);    }}

使用RefWatcher监控Fragment:

public abstract class BaseFragment extends Fragment {    @Override     public void onDestroy() {        super.onDestroy();        RefWatcher refWatcher = ExampleApplication.getRefWatcher(getActivity());        refWatcher.watch(this);    }}

可以看到,不管哪种方式,都需要调用LeakCanary.install()方法,因此接下来的源码分析将从这个方法开始。

3.LeakCanary源码分析

第一部分:初始化工作

先来看下LeakCanary初始化工作时序图:

注:本文内容来自互联网,旨在为开发者提供分享、交流的平台。如有涉及文章版权等事宜,请你联系站长进行处理。