虚引用

作者: 卡路fly | 来源:发表于2020-06-07 13:27 被阅读0次

https://www.cnblogs.com/mfrank/p/9837070.html

定义

虚引用是使用PhantomReference创建的引用,虚引用也称为幽灵引用或者幻影引用,是所有引用类型中最弱的一个。一个对象是否有虚引用的存在,完全不会对其生命周期构成影响,也无法通过虚引用获得一个对象实例。

虚引用并不会决定对象的生命周期。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收。

虚引用主要用来跟踪对象被垃圾回收的活动。

虚引用与软引用和弱引用的一个区别

虚引用必须和引用队列(ReferenceQueue)联合使用。当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中。程序可以通过判断引用队列中是否已经加入了虚引用,来了解被引用的对象是否将要被垃圾回收。程序如果发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存被回收之前采取必要的行动。

说明

如果一个对象与GC Roots之间仅存在虚引用,则称这个对象为虚可达(phantom reachable)对象。

当试图通过虚引用的get()方法取得强引用时,总是会返回null,并且,虚引用必须和引用队列一起使用

作用在于跟踪垃圾回收过程,在对象被收集器回收时收到一个系统通知。 当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在垃圾回收后,将这个虚引用加入引用队列,在其关联的虚引用出队前,不会彻底销毁该对象。 所以可以通过检查引用队列中是否有相应的虚引用来判断对象是否已经被回收了。

如果一个对象没有强引用和软引用,对于垃圾回收器而言便是可以被清除的,在清除之前,会调用其finalize方法,如果一个对象已经被调用过finalize方法但是还没有被释放,它就变成了一个虚可达对象。

与软引用和弱引用不同,显式使用虚引用可以阻止对象被清除,只有在程序中显式或者隐式移除这个虚引用时,这个已经执行过finalize方法的对象才会被清除。想要显式的移除虚引用的话,只需要将其从引用队列中取出然后扔掉(置为null)即可。

适用场景

使用虚引用的目的就是为了得知对象被GC的时机,所以可以利用虚引用来进行销毁前的一些操作,比如说资源释放等。这个虚引用对于对象而言完全是无感知的,有没有完全一样,但是对于虚引用的使用者而言,就像是待观察的对象的把脉线,可以通过它来观察对象是否已经被回收,从而进行相应的处理。

事实上,虚引用有一个很重要的用途就是用来做堆外内存的释放,DirectByteBuffer就是通过虚引用来实现堆外内存的释放的。

小结

  • 虚引用是最弱的引用
  • 虚引用对对象而言是无感知的,对象有虚引用跟没有是完全一样的
  • 虚引用不会影响对象的生命周期
  • 虚引用可以用来做为对象是否存活的监控

相关文章

  • JAVA引用(WeakHashMap、Cleaner)

    Reference 引用类 强引用、软引用、弱引用、虚引用 软引用、弱引用、虚引用,可以配合ReferenceQu...

  • 虚引用

    https://www.cnblogs.com/mfrank/p/9837070.html 定义 虚引用是使用Ph...

  • JAVA四种引用(强引用,弱引用,软引用,虚引用)

    JAVA四种引用(强引用,弱引用,软引用,虚引用) [toc] 参考:Java 的强引用、弱引用、软引用、虚引用四...

  • LeakCanary 与内存泄漏定位

    虚引用 在了解 LeakCanary 之前,先来了解下虚引用。 虚引用必须与 ReferenceQueue 一起使...

  • Java引用类型之 :虚引用

    1 简述 虚引用是使用PhantomReference创建的引用,虚引用也称为幽灵引用或者幻影引用,是所有引用类型...

  • 14-强引用、软引用、弱引用、虚引用以及对象的finalizat

    强引用、软引用、弱引用、虚引用 Java有不同的引用类型,分别是:强引用、软引用、弱引用、虚引用,不同的引用类型跟...

  • NIO与DirectByteBuffer

    首先,先解释几个概念: *虚引用:虚引用算是最弱的引用类型,不能通过他来获取目标对象,虚引用主要被用来跟踪对象被垃...

  • 第三章

    1.虚引用的作用在书中介绍了强引用、软引用、弱引用、虚引用。那么虚引用的功能到底是什么呢?在垃圾回收的过程中,当对...

  • 弱引用,虚引用,强引用

    强引用:直接的对象引用;软引用:当一个对象只有软引用存在时,系统内存不足时此对象会被gc回收;弱引用:当一个对象只...

  • java基础知识

    java对象的强引用,软引用,弱引用和虚引用

网友评论

      本文标题:虚引用

      本文链接:https://www.haomeiwen.com/subject/jpimzhtx.html