简介
LeakCanary是Square公司研发的一个可视化的内存泄漏分析工具,github地址为https://github.com/square/leakcanary。
它的使用非常简单,下面我们将一步步进行分析。
集成LeakCannary
在我们的build.gradle中添加如下依赖:
dependencies {
debugImplementation 'com.squareup.leakcanary:leakcanary-android:1.6.1'
releaseImplementation 'com.squareup.leakcanary:leakcanary-android-no-op:1.6.1'
// Optional, if you use support library fragments:
debugImplementation 'com.squareup.leakcanary:leakcanary-support-fragment:1.6.1'
}
在Application中添加类似如下代码:
public class ExampleApplication extends Application {
@Override public void onCreate() {
super.onCreate();
LeakCanary.install(this);
}
}
添加完成之后,我们就可以使用LeakCannary了。
应用举例
要想使用LeakCannary对各个类进行监控,需要创建RefWatcher,所以我们首先重写Application,然后创建RefWatcher供外部使用。
public class LeakApplication extends Application {
private static RefWatcher refWatcher;
@Override
public void onCreate() {
super.onCreate();
refWatcher = LeakCanary.install(this);
}
//提供给外部调用的方法
public static RefWatcher getRefWatcher() {
return refWatcher;
}
}
接下来我们创建一个Activity,然后手动制造一个内存泄漏。
public class LeakActivity extends Activity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_leak);
LeakThread leakThread = new LeakThread();
leakThread.start();
}
@Override
protected void onDestroy() {
super.onDestroy();
LeakApplication.getRefWatcher().watch(this);
}
class LeakThread extends Thread {
@Override
public void run() {
try {
Thread.sleep(6 * 60 * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
注意,要想检测内存泄漏,需要再Activity的onDestroy中调用RefWatcher的watch方法。
LeakActivity存在内存泄漏,因为非静态内部类LeakThread持有外部类LeakActivity的引用,导致LeakActivity无法被回收。
然后我们自己测试,就可以通过状态栏查看到泄露的具体信息。