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