虚引用和引用队列

来自颜群老师的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帮助我们回收一些不需要的对象,就不需要写析构函数了。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

加把劲骑士RideOn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值