##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。#####参考地址