剖析LeakCanary—— 上篇

本文详细解析了Java中的四种引用类型:强引用、软引用、弱引用和虚引用,以及它们之间的区别。同时,深入探讨了引用队列(ReferenceQueue)的使用场景和实现原理,包括其在不同JDK版本中的FIFO与LIFO实现差异,并暗示了LeakCanary内存泄漏检测工具可能的实现方式。

狭路相逢宜回身,往来都是暂时人。

1.吐槽大会

今天刚到工位上组内同事跑过来问我,What’s 引用队列? 中午吃饭闲聊时,才知道面试被问住啦。这里根据其描述,大概总结如下:

  1. Java中的四种引用类型?并简述一下其区别
  2. 平时开发中一般用到哪几种啊?(据实回答,否则分分钟打脸,同事的脸现在还是红的呢 ~2333)
  3. 了解引用队列(Reference Queue) 吗?(这都回答不出来, 面试就到这里吧…)
  4. 八成概率是要问 LeakCanary的原理?或者是 如何造一个类似LeakCanary的轮子?

听了同事的无厘头的抱怨,不得不吐槽一下,有时候专业的面试官遇到非专业的面试者,那也是秀才遇见兵啊…


1.2 面试官心里苦啊

秀才遇见兵,有理说不清啊…

试想一下,如果上来直接问你LeakCanary的原理,就算以前看过其源码的人也要思索回顾一下吧(背答案的就不提了…)。按照这位面试官的问法,答案是水到渠成。 退一步讲,如果上面3问都回答出来,就算答不出第4问,也会进一步引导并加以考虑的。(Generally speaking, 知道前3问,没有理由答不出第4问,唯一的理由:紧张)


2. Java的四种引用类型及区别

以下盗的图把Java的四种引用类型及区别都描述的很清楚啦

在这里插入图片描述

Java中的四种引用类型

在Android开发中,我们一般用到强引用弱引用(WeakReference),根据个人的实际情况即可。

3. 引用队列(ReferenceQueue)

引用队列是配合软引用弱引用虚引用一起使用的,当这些引用被GC时,就将其加入到引用队列中。

值得注意是:
官方JDK的实现是FIFO(先进先出)
OpenJDK的实现是LIFO(后进先出)

public class ReferenceQueue<T> {
    // NOTE: This implementation of ReferenceQueue is FIFO (queue-like) whereas
    // the OpenJdk implementation is LIFO (stack-like).
    private Reference<? extends T> head = null;
    private Reference<? extends T> tail = null;
  }

3.1 引用队列的使用

当我们希望在一个对象被GC时得到反馈或者进一步处理,就需要借助于引用队列

public class WeakReference<T> extends Reference<T> {

    public WeakReference(T referent) {
        super(referent);
    }
	// 注意这个构造函数:将引用放入到指定的引用队列中,我们可以对queue进行监控
    public WeakReference(T referent, ReferenceQueue<? super T> q) {
        super(referent, q);
    }
}

4. 总结

根据我们上面的描述,当弱引用软引用虚引用被回收时,这些引用将会被加入到引用队列(ReferenceQueue)中。

根据这些知识点,让我们猜测LeakCanary的实现原理 —— 借助于ReferenceQueue的状态来判断。

欢迎继续查看: 剖析LeakCanary—— 中篇

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值