来自颜群老师的JVM课程
虚引用是什么
虚引用又称为:幻影引用或幽灵引用
在java.lang.ref包下的PhantomReference<T> 类下
是否使用虚引用和引用对象本身没有任何关系;
无法通过虚引用获取对象本身。
软引用和弱引用,get()操作总是能获取引用对象
虚引用的get()则被重写成了return null;
虚引用的使用
虚引用不会单独使用,一般会和引用队列(java.lang.ref.ReferenceQueue)一起使用
价值
当GC回收一个对象时,如果GC发现该对象还有一个虚引用,就会将该虚引用放入 引用队列中,等待该虚引用出队后再去回收
一般引用GC过程:GC -> 回收
虚引用GC过程:GC -> -> 虚引用存在 -> 虚引用入队 -> 虚引用出队 -> 回收
因此,我们可以使用虚引用 + 引用队列实现:引用对象在被回收之前进行一些操作
检测虚引用被GC后是否入队
结果:
- 虚引用被GC回收后,确实进入了引用队列
- 入队前的虚引用和出队后的是同一对象
重写finalize()方法,导致虚引用延迟入队
finalize()方法是Object类下的方法,作用是在GC回收对象之前执行一些操作。
如果GC回收的虚引用指向引用对象中 重写了finalize()方法,则虚引用延迟入队(即GC回收后的出队信息为null)
但实际结果是,延迟入队后,一般执行两次出队方法就会出队,也有可能是三次。
最终引用
最终引用不属于JVM引用类型。
作用:例如C++中的构造函数用来创建对象,析构函数用来释放对象,在java中没有析构函数,而是通过Finalizer帮助我们回收一些不需要的对象,就不需要写析构函数了。