51.LeakCanary分析

使用

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生命週期的監聽執行與停止

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章