这一篇博客主要记录一下LeakCanary的使用方式。
一、LeakCanary简介
目前,Java程序最常用的内存分析工具是MAT。
MAT的使用比较简单,但分析对应数据的步骤较为繁琐,结果也不够直观。
针对这个情况,Square公司为Android开发者,供了一个自动检测内存泄漏的工具,即LeakCanary。
LeakCanary被集成到Android工程后,一旦发现应用出现内存泄露问题,
就会主动弹出一个通知,然后在通知拉起的界面上,显示出问题的详细信息。
LeakCanary是一个开源工具,感兴趣的朋友可以研究一下它的源码,
由于我并没有深入分析过,因此此处仅结合网上的资料,简要记录一下它的原理。
1.1 发现潜在泄漏对象
LeakCanary被使用后,将会创建一个RefWatcher对象。
RefWatcher对象的watch方法被调用后,将会使用WeakReference引用Activity、Fragment等对象。
同时,RefWatcher会为这些对象生成唯一的Key值,然后将每个对象的Key、WeakReference与ReferenceQueue关联起来。
此外,LeakCanary会创建一个集合retainedKeys保存所有对象的Key值。
系统每次GC时,LeakCanary都可以扫描ReferenceQueue,
得到被释放对象的WeakReference(弱引用对象被释放后,对应的引用将被添加到ReferenceQueue中)。
然后,根据映射关系,LeakCanary得到WeakReference对应的Key值,
并将这些Key值从retainedKeys中移除。
于是,每次GC后,retainedKeys中剩余Key对应的对象,就是潜在的内存泄漏对象。
上述整个过程,基本思路如下图所示: