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。