LeakCanary——消除Android中的內存泄露

##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'
 }

在這裏分別使用了debugCompilereleaseComile是爲了在開發測試和發佈時,發現內存泄露執行不一樣Action。github

當使用debug編譯時,若是Activity發生了內存泄露,LeanCanary會自動發送Notification提醒你,點擊以後會展示內存泄露的詳細信息,列出相關的對象引用。 內存泄露詳細信息 而且還會在logcat中打印相關的信息:app

In com.example.leakcanary:1.0:1 com.example.leakcanary.MainActivity has leaked:ide

  • GC ROOT thread java.lang.Thread.<Java Local> (named 'AsyncTask #1')
  • references com.example.leakcanary.MainActivity$3.this$0 (anonymous class extends android.os.AsyncTask)
  • leaks com.example.leakcanary.MainActivity instance
  • Reference Key: e71f3bf5-d786-4145-8539-584afaecad1d
  • Device: Genymotion generic Google Nexus 6 - 5.1.0 - API 22 - 1440x2560 vbox86p
  • Android Version: 5.1 API: 22
  • Durations: watch=5086ms, gc=110ms, heap dump=435ms, analysis=2086ms

若是你認爲LeakCanary能作的只有這樣,那你就大錯特錯了。只要你想,它還能夠監視任何對象。測試

RefWatcher refWatcher = LeakCanary.install(this);

而後在你以爲對象要被虛擬機回收的時機讓RefWatcher觀察這個對象:this

refWatcher.watch(obj)

####結果 在使用LeakCanary以後,Square聲稱減小了94%OOM產生的crash,甚至還發現了Android SDK中的內存泄露OOM產生的Crash線程

####原理

其實LeakCanary的原理也很簡單,簡單來講就是建立了一個WeakReference對象,若是觸發了GC以後這個對象存在,則說明發生了內存泄露。接着dump內存,分析引用,發送通知。

  1. RefWatcher.watch()在觀察對象中添加一個KeyedWeakReference
  2. 接着過一段時間,後臺線程會檢查觀察對象是否還存活着,若是是,則觸發GC。
  3. 若是觀察對象仍然存在,則表示發生了內存泄露。LeakCanary會dump內存生成.hprof文件在應用文件目錄下。
  4. 在另外一個進程中啓動HeapAnalyzerServiceHeapAnalyzer藉助HAHA來分析內存。
  5. HeapAnalyzer在dump文件中找到KeyedWeakReference,而且找到泄露的引用。
  6. HeapAnalyzer計算到GG Root的最短路徑,並判斷是不是一個的內存泄露。若是是,生成引用的路徑鏈。
  7. 最終接口會發送到app進程中的DisplayLeakService,執行接下來的操做,debug環境默認是發送一個Notification。

#####參考地址

相關文章
相關標籤/搜索