LeakCanary原理分析
ActivityRefWatcher中,注册Activity生命周期监听接口,当Activity onDestroy()被调用时,将当前Activity加入内存泄漏监听队列。
private final Application.ActivityLifecycleCallbacks lifecycleCallbacks =
new Application.ActivityLifecycleCallbacks() {
@Override public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
}
@Override public void onActivityStarted(Activity activity) {
}
@Override public void onActivityResumed(Activity activity) {
}
@Override public void onActivityPaused(Activity activity) {
}
@Override public void onActivityStopped(Activity activity) {
}
@Override public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
}
@Override public void onActivityDestroyed(Activity activity) {
ActivityRefWatcher.this.onActivityDestroyed(activity);
}
};
public void watchActivities() {
// Make sure you don't get installed twice.
stopWatchingActivities();
application.registerActivityLifecycleCallbacks(lifecycleCallbacks);
}
public void stopWatchingActivities() {
application.unregisterActivityLifecycleCallbacks(lifecycleCallbacks);
}RefWatcher中,watch方法将对象用WeakReference引起来,监听对象是否内存泄漏
dump文件分析,HeapAnalyzer类
对第2步基本原理的进一步补充:
1. 主动GC,采用Runtime.getRuntime().gc()(对比System.gc()的优点是能保证及时触发GC),同时GC后等待100ms,等待Java虚拟机把这个弱引用加入ReferenceQueue。参考GcTrigger类。
步骤2执行时机的选择,参考AndroidWatchExecutor类。
Last updated