##LeakCanaryhtml
####簡介 LeakCanary是Square公司最近公佈的開源項目,旨在消除Android中的內存泄露(Memory Leak),項目地址猛戳這裏。java
####使用 LeakCanary的使用也很是之簡單,僅須要在Application中添加一行代碼android
public class ExampleApplication extends Application { @Override public void onCreate() { super.onCreate(); LeakCanary.install(this); } }
固然依賴也是必須的git
dependencies { debugCompile 'com.squareup.leakcanary:leakcanary-android:1.3' releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.3' }
在這裏分別使用了
debugCompile
和releaseComile
是爲了在開發測試和發佈時,發現內存泄露執行不一樣Action。github
當使用debug編譯時,若是Activity發生了內存泄露,LeanCanary會自動發送Notification提醒你,點擊以後會展示內存泄露的詳細信息,列出相關的對象引用。 而且還會在logcat中打印相關的信息:app
In com.example.leakcanary:1.0:1 com.example.leakcanary.MainActivity has leaked:ide
若是你認爲LeakCanary能作的只有這樣,那你就大錯特錯了。只要你想,它還能夠監視任何對象。測試
RefWatcher refWatcher = LeakCanary.install(this);
而後在你以爲對象要被虛擬機回收的時機讓RefWatcher
觀察這個對象:this
refWatcher.watch(obj)
####結果 在使用LeakCanary以後,Square聲稱減小了94%OOM產生的crash,甚至還發現了Android SDK中的內存泄露。 線程
####原理
其實LeakCanary的原理也很簡單,簡單來講就是建立了一個WeakReference對象,若是觸發了GC以後這個對象存在,則說明發生了內存泄露。接着dump內存,分析引用,發送通知。
RefWatcher.watch()
在觀察對象中添加一個KeyedWeakReference。.hprof
文件在應用文件目錄下。HeapAnalyzerService
,HeapAnalyzer
藉助HAHA來分析內存。HeapAnalyzer
在dump文件中找到KeyedWeakReference
,而且找到泄露的引用。HeapAnalyzer
計算到GG Root的最短路徑,並判斷是不是一個的內存泄露。若是是,生成引用的路徑鏈。DisplayLeakService
,執行接下來的操做,debug環境默認是發送一個Notification。#####參考地址