android 内存泄漏分析工具 LeakCanary
内存泄漏的原因:
某个对象在释放的时候由于被其他对象持有,而没有释放,造成了内存泄漏
在手机上即可查看问题即引用关系, MAT需要分析HeapDump, 找Path To GC Roots
在app的build.gradle中加入依赖:
dependencies {
debugCompile 'com.squareup.leakcanary:leakcancary-android:1.3.2'
releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.3.1'
testCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.3.1'
}
然后在Application中加入类似如下的代码:
public class ExampleApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
LeakCanary.install(this);
}
}
leakcancary其实在本机上做了HeapDump,然后对生成的hprof
分析文件,进行结果展示。
和手工进行MAT分析步骤基本一致。
因为存在
debugCompile
和releaseCompile``testCompile
所有不影响对外版的APK
目前只可以一次报一个泄漏问题
想要检测更多?
获取一个RefWatcher,用来后续监控可能发生泄漏的对象
public class ExampleApplication extends Application {
private static RefWatcher sRefWatcher;
@Override
public void onCreate() {
super.onCreate();
sRefWatcher = LeakCanary.install(this);
}
public static RefWatcher getRefWatcher() {
return sRefWatcher;
}
}
当要去监控某个可能存在内存泄漏的对象(myContext)时:
ExampleApplication.getRefWatcher().watch(myContext);
监控fragment
public class CustomFragment extends Fragment {
@Override
public void onDestroy() {
super.onDestroy();
ExampleApplication.getRefWatcher().watch(this);
}
}
Fragment和Activity实例一样可能持有大量的视图以及视图需要的资源(bitmap),可以在
Fragment onDestroy方法中加入实现