使用
debugCompile 'com.squareup.leakcanary:leakcanary-android:1.3'
releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.3'
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
LeakCanary.install(this)
}
}
源碼
1.LeakCanary是怎麼做到install之後自動監測Activity的?
調用install後,會註冊一個Activity生命週期的回調監聽,registerActivityLifecycleCallbacks,來綁定Activity生命週期,在Activity執行onDestroy時,調用watch方法開始檢測當前頁面是否存在內存泄漏,並分析結果(如果想要在非Activity如Fragment檢測是否存在內存泄漏,需要手動添加,調用watch方法)
2.如何判定Activity是否發生了內存泄漏
KeyedWeakReference與ReferenceQueue聯合使用,將onDestroy的Activity對象包裹成一個弱引用對象(KeyedWeakReference),開啓異步線程,在弱引用關聯的對象被回收後,會將引用添加到ReferenceQueue;清空後,可以根據是否繼續含有該引用來判定是否被回收;判定回收, 手動GC, 再次判定回收,採用雙重判定來確保當前引用是否被回收的狀態正確性;如果兩次都未回收,則確定爲泄漏對象。
3.內存泄漏軌跡是如何生成的
採用eclipse.Mat來分析泄漏詳細,從GCRoot開始逐步生成引用軌跡。
4.內存分析是在單獨的進程執行的嗎,爲什麼?
內存分析模塊是在獨立進程中執行的,這麼設計是爲了保證內存分析過程不會對App進程造成消極的影響
5.檢測是否發生泄漏是在主線程還是子線程
開啓了一個子線程檢測的
5.Leak Canary核心類及其作用
1.DisplayLeakActivity
內存泄漏的查看頁面
2.HeapAnalyzerService
內存堆分析服務, 爲了保證App進程不會因此受影響變慢&內存溢出,運行於獨立的進程
3.HeapAnalyzer
分析由RefWatcher生成的堆轉儲信息, 驗證內存泄漏是否真實存在
4.HeapDump
堆轉儲信息類,存儲堆轉儲的相關信息
5.ServiceHeapDumpListener
一個監聽,包含了開啓分析的方法
6.RefWatcher
核心類, 翻譯自官方: 檢測不可達引用(可能地),當發現不可達引用時,它會觸發
7.HeapDumper
(堆信息轉儲)
8.ActivityRefWatcher
Activity引用檢測, 包含了Activity生命週期的監聽執行與停止