玩转LeakCanary
[TODO] 总结了LeakCanary原理及用法。
如何使用LeakCanary
LeakCanary.install()
返回一个预先配置好的RefWatcher
。该方法同时还会自动使用ActivityRefWatcher
,这个对象自动检测Activity.onDestroy()
后activity是否有泄漏。
1 | public class ExampleApplication extends Application { |
可以使用RefWatcher
用到检查应当被GC的引用:
1 | RefWatcher refWatcher = {...}; |
可以使用RefWatcher
检查fragment的泄漏情况:
1 | public abstract class BaseFragment extends Fragment { |
工作原理
RefWatcher.watch()
创建指向被检查对象的KeyedWeakReference- 之后,在后台线程中检查引用是否被清除,如果没有的话GC一下
- 如果引用仍然没有清除,则导出heap到
.hprof
文件,并保存到文件系统 - 一个独立的进程启动
HeapAnalyzerService
,HeapAnalyzer
使用HAHA解析heap dump HeapAnalyzer
在使用key在heap dump中找到KeyedWeakReference
,定位到泄漏的引用HeapAnalyzer
计算 到GC根节点的最短强引用 以确定是否有内存泄漏,然后重新构建导致内存泄漏的引用链- 分析结果发送到应用进程的
DisplayLeakService
,并且通过notification进行提示