LeakCanary Android 和 Java 內存泄露檢測。

開始使用

在 build.gradle 中加入引用,不一樣的編譯使用不一樣的引用:java

dependencies {
   debugCompile 'com.squareup.leakcanary:leakcanary-android:1.3'
   releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.3'
 }

在 Application 中:android




public class ExampleApplication extends Application { @Override public void onCreate() { super.onCreate(); LeakCanary.install(this); } }

如何使用

使用 RefWatcher 監控那些本該被回收的對象。git

RefWatcher refWatcher = {...}; // 監控 refWatcher.watch(schrodingerCat); 

LeakCanary.install() 會返回一個預約義的 RefWatcher,同時也會啓用一個 ActivityRefWatcher,用於自動監控調用Activity.onDestroy() 以後泄露的 activity。github

public class ExampleApplication extends Application { public static RefWatcher getRefWatcher(Context context) { ExampleApplication application = (ExampleApplication) context.getApplicationContext(); return application.refWatcher; } private RefWatcher refWatcher; @Override public void onCreate() { super.onCreate(); refWatcher = LeakCanary.install(this); } } 

使用 RefWatcher 監控 Fragment:app




public abstract class BaseFragment extends Fragment { @Override public void onDestroy() { super.onDestroy(); RefWatcher refWatcher = ExampleApplication.getRefWatcher(getActivity()); refWatcher.watch(this); } }

工做機制

  1. RefWatcher.watch() 建立一個 KeyedWeakReference 到要被監控的對象。ide

  2. 而後在後臺線程檢查引用是否被清除,若是沒有,調用GC。gradle

  3. 若是引用仍是未被清除,把 heap 內存 dump 到 APP 對應的文件系統中的一個 .hprof 文件中。ui

  4. 在另一個進程中的 HeapAnalyzerService 有一個 HeapAnalyzer 使用HAHA 解析這個文件。this

  5. 得益於惟一的 reference key, HeapAnalyzer 找到 KeyedWeakReference,定位內存泄露。spa

  6. HeapAnalyzer 計算 到 GC roots 的最短強引用路徑,並肯定是不是泄露。若是是的話,創建致使泄露的引用鏈。

  7. 引用鏈傳遞到 APP 進程中的 DisplayLeakService, 並以通知的形式展現出來。

相關文章
相關標籤/搜索