Android:LeakCanary

LeakCanary

添加依赖

debugImplementation 'com.squareup.leakcanary:leakcanary-android:1.6.3'
releaseImplementation 'com.squareup.leakcanary:leakcanary-android-no-op:1.6.3'

设置Application

public class LeakApplication extends Application {
    @Override public void onCreate() {
        super.onCreate();
        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(this);
    }
}

配置文件

将创建的Application注册到AndroidManifest.xml中。

android:name=".LeakApplication"

单例内存泄漏

创建单例模式实现的类。

public class Singleton {
    private static Singleton instance;
    private Context context;
    private Singleton(){};
    public Singleton getInstance(Context context){
        if(instance==null){
            instance = new Singleton();
        }
        instance.context = context;
        return instance;
    }
}

并在MainActivity中获取该类的实例,传入context

Singleton.getInstance(this);

运行代码,并关闭MainActivity。发现LeakCanary检测到了内存泄漏。

显然类似Singleton的单例类在整个应用的生命中,存活的时间比单个Activity要长。如果传入Activity的context,就会导致Activity在销毁后还被持有,不能被虚拟机进行回收。

因此在此应修改为

Singleton.getInstance(getApplicationContext());

也可以使用弱引用。