LeakCanary原理

yuanhong發表於2017-12-27

LeakCanary通過square自家的HAHA來自動化分析Android heap dumps,內部基於MAT, vshor/mat,AndroMAT來做Java和Android特定的heap分析,亮點則是其將需要人工分析的事情做到了完全自動化,並給出能幫助快速定位修復記憶體洩露的資訊。

在Application中使用LeakCanary.install(this)後,LeakCanary就會自動install一個ActivityRefWatcher來自動化檢測activity是否在onDestroy後有洩露。具體步驟大致是

. 自動把activity加入到KeyedWeakReference

在background執行緒中,檢查onDestroy後reference是否被清除,且沒有觸發gc

如果reference沒有被清除,則dump heap到一個hprof檔案並儲存到app檔案系統中

在一個單獨程式中啟動HeapAnalyzerService,HeapAnalyzer使用HAHA來分析heap dump。

HeapAnalyzer在heap dump中根據reference key找到KeyedWeakReference。

HeapAnalyzer計算出到GC Roots的最短強引用路徑來判斷是否存在洩露,然後build出造成這個洩露的引用鏈。

結果被傳回來app程式的DisplayLeakService,並展示一個洩露的notification。

square稱從用了LeakCanary後,發現並修復了很多他們app中的記憶體洩露,而且找到了一些Android SDK中的洩露,最終減少了94%因為OOM錯誤導致的crash。

相關文章