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());
也可以使用弱引用。