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。

#####参考地址

相关文章
相关标签/搜索