当前位置: 首页 > 科技观察

四种类型的对象引用有什么区别?你知道吗?

时间:2023-03-19 00:09:12 科技观察

一位工作4年的小伙伴在面试中被问到这样一个问题,Java中的4种对象引用有什么区别?这个面试题比较偏,用的比较多的是一些底层的类库或者框架。涉及到的知识点有JVM、GC等,一般人真的很少去关注。Java中的四种引用类型主要是指strong、soft、weak、virtual。它们主要反映了对象的不同可达性状态及其对GC的影响。下面我就我对这四类引用的理解,给大家详细分析一下。1、强引用:只要引用关系还在,对象就永远不会被回收。其实就是指普通对象的引用。只要有引用关系,就说明这个对象还活着,垃圾回收器是无法回收这类对象的。只有当没有其他引用关系或超出引用范围,或对象引用被强制赋值为null时,垃圾回收器才会回收该对象。2、软引用:不必存活的对象,JVM会在内存溢出前回收它们。它是比强参考更弱的参考。对象可以免于某些垃圾收集操作。只有当JVM判断内存不足时,才会尝试回收引用指向的对象。软引用通常用于实现一些对内存敏感的缓存。如果还有空闲内存,可以暂时保留缓存,当内存不足时会清理掉。这可确保在不耗尽内存的情况下使用缓存。3.弱引用:不必存活的对象,不管内存是否充足,都会被下一次GC回收。弱引用是相对于强引用而言的,强引用是允许引用关联时可以被垃圾回收的对象。当垃圾收集器线程扫描其管辖的内存区域时,一旦发现只有弱引用的对象,无论当前内存空间是否足够,垃圾收集器都会回收内存。4.幻引用:相当于没有引用,对象被回收时会通知你。幻引用并不能决定对象的生命周期,它提供了一种机制来保证对象在终结之后做某些事情。当垃圾回收期即将回收一个对象时,如果发现它还有一个虚引用,就会在回收该对象的内存之前,将这个虚引用添加到与其关联的引用队列中。程序可以通过判断引用队列中是否有Phantom引用被添加来判断被引用对象是否应该被垃圾回收器回收。然后,我们可以在引用对象被回收之前执行一些必要的操作。因此,幻象引用必须与引用队列一起使用。以上分享比较官方。举个通俗的例子,大家更容易理解。强引就像是电视剧里的男主,怎么死都死不了。软语录就像女主角,有过一段经历,却没有走到尽头。弱参照是男二号,注定要被牺牲。伪引用是路人甲。以上就是我对Java中四种引用对象的理解。有兴趣的朋友可以进一步研究。