leakcannry工作原理

一,概念

1.1 ReferenceQueue含义及作用
通常我们将其ReferenceQueue翻译为引用队列,换言之就是存放引用的队列,保存的是Reference对象。其作用在于Reference对象所引用的对象被GC回收时,该Reference对象将会被加入引用队列中(ReferenceQueue)的队列末尾。

1.2 如果判断Reference引用的对象已经回收呢?
1.2.1 如果引用列表ReferenceQueue中取出的Reference不为空,那么说明对象已经被回收。
1.2.2 如果为空,表示已经泄露。

二. leakcannry怎么检测泄露

  1. install的时候会注册acticityLifecycleCallbacks的监听,用于监听onDestry(相当于第一次GC)的执行。
  2. 创建reWacher对象,改对象中会维护两个列表,watchedReferences(观察列表),retainedReferences(怀疑列表)
  3. 当执行watch方法(onDestry执行的时候调用)的时候,
    3.1. 会先清除观察列 表和怀疑列表,
    3.2. 然后创建一个WeakReference,并且生成一个唯一的key,把WeakReference与引用队列相关联。
    3.3 把当前的WeakReference加入到观察列表。
    4.等待5秒后,如果对象回收了,引用队列中就会有数据,那么就会取出引用队列中的WeakReference和观察列表中的WeakReference比较(通过之前生成的key),如果一致,就把观察列表中的WeakReference移除。如果观察列表中有数据,说明可能存在泄漏,那么就把这个WeakReference从观察列表移动到怀疑列表。
    5.在工作线程中检测内存泄露
    如果WeakReference加入到怀疑列表,那么会再次主动执行一次GC,如果被回收就结束,否则就dump heap内存
    在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值