leakCanary是用来检测内存泄漏的重要工具,下面是它的主要原理:
弱引用:当垃圾回收时,无论内存是否充足,都会将弱引用包装的对象回收。
当jvm进行垃圾回收时,无论内存是否充足,如果该对象只有弱引用存在,那么该对象会被垃圾回收器回收,同时该引用会被加入到关联的ReferenceQueue。因此程序通过判断引用队列中是否已经包含指定的引用,来了解被引用的对象是否被GC回收(引用队列存在指定的弱引用,说明对象被回收)
所以leakCanary在进行内存泄漏监控时,利用弱引用的上述特性,在对象生命周期结束后主动gc,并检查该对象的弱引用是否被回收,如果弱引用没有被正常回收,说明在对象生命周期结束之后,该对象还被其他对象持有它的非弱引用,该对象还有到达GC ROOT的可达路径,如果在生命周期结束之后弱引用不存在了,说明该对象已经被jvm的垃圾回收机制回收掉了,该对象的内存 空间也被正常回收。