LeakCanary知识点

445 阅读1分钟

1.RefWatcher.watch方法每次监控的时候都把一个独一无二的监控对象的key加入retainedKeys.add(key) 这个map.

2.知识点:弱引用和引用队列 ReferenceQueue联合使用时,如果弱引用持有的对象被垃圾回收,Java 虚拟机就会把这个弱引用加入到与之关联的引用队列中。即 KeyedWeakReference 持有的 Activity 对象如果被垃圾回收,该对象就会加入到引用队列 queue。

3.在判断内存是否泄漏的RefWatcher.ensureGone关键方法,首先遍历2中的queue,如果存在当前监控对象的弱引用,有的话,就删除1中对应的key.

4.遍历1中的retainedKeys,发现监控对象的key没被删除,也就是在3没有被删除,也就是弱引用没有加入队列,也就是监控对象没被回收。

5.执行一次 gc,因为防止有些对象不可达了,但是没有加入queue队列。Runtime.getRuntime().gc()。

6.再执行3步骤,如果key还是存在,那就肯定内存泄漏了。

总结:Leakcanary的原理就是通过系统方法application.registerActivityLifecycleCallbacks监控应用中所有activity生命周期中的onDestroy方法,在onDestroy中把activity转成弱引用保存在引用队列中,然后框架会在当主线程空闲时,通知后台线程延时 5秒执行检测工作,检测监控对象是否在queue中,并输出内存泄漏的最短路径。

参考:juejin.cn/post/684490…