LeakCanary實(shí)現(xiàn)原理:
首先將Activity用弱引用(WeakReference)包裝并綁定引用隊(duì)列(ReferenceQueue),系統(tǒng)在gc的時(shí)候會(huì)優(yōu)先回收弱引用,同時(shí)將要回收的引用放到引用隊(duì)列中。所以只要判斷引用隊(duì)列中是否存在目標(biāo)引用,就可以判斷目標(biāo)引用是否存在內(nèi)存泄漏(如果存在則說明沒有內(nèi)存泄漏,反之則說明有內(nèi)存泄漏)。
如何保證GC立即執(zhí)行?
GcTrigger DEFAULT = new GcTrigger() {
@Override public void runGc() {
// Code taken from AOSP FinalizationTest:
// https://android.googlesource.com/platform/libcore/+/master/support/src/test/java/libcore/
// java/lang/ref/FinalizationTester.java
// System.gc() does not garbage collect every time. Runtime.gc() is
// more likely to perform a gc.
Runtime.getRuntime().gc();
enqueueReferences();
System.runFinalization();
}
private void enqueueReferences() {
// Hack. We don't have a programmatic way to wait for the reference queue daemon to move
// references to the appropriate queues.
try {
Thread.sleep(100);
} catch (InterruptedException e) {
throw new AssertionError();
}
}
};
監(jiān)測(cè)實(shí)現(xiàn)流程:
Application初始化 -> 注冊(cè)ActivityLifecycleCallbacks ->在ActivityLifecycleCallbacks的onDestroy()中調(diào)用RefWatcher.watch()->watch()方法中判斷是否存在內(nèi)存泄漏,HeapDumper抓取dump文件并通過HeapAnalyzerService.runAnalysis分析-> 最后通過DisplayLeakService展示內(nèi)存泄漏信息