Java对象引用级别(强引用、软引用、弱引用、虚引用)

Java从JDK1.2开始提供了四种引用级别:强引用、软引用、弱引用和虚引用。强引用是默认引用,GC不会回收;软引用在内存充足时保持,内存紧张时回收;弱引用对象一旦被发现,不论内存状况都会回收;虚引用无法直接访问对象,仅用于GC通知机制。引用队列用于跟踪引用对象的回收。
摘要由CSDN通过智能技术生成

为了使程序能更灵活地控制对象生命周期,从 JDK1.2 版本开始,JDK把对象的引用级别由高到低分为强引用、软引用、弱引用、虚引用四种级别。
在这里插入图片描述

  1. 强引用 StrongReference

强引用是我们最常见的对象,它属于不可回收资源,垃圾回收器(后面简称G C)绝对不会回收它,即使是内存不足,J V M宁愿抛出 OutOfMemoryErrorM 异常,使程序终止,也不会来回收强引用对象。

User user = new User();
  1. 软引用 SoftReference
  • 如果对象是软引用,那它的性质属于可有可无,因为内存空间充足的情况下,G C不会回收它,但是内存空间紧张,G C发现它仅有软引用,就会回收该对象,所以软引用对象适合作为内存敏感的缓存对象。
  • 只有对象仅被 SoftReference 引用,它才是软引用级别对象,因为对象可以在多处被引用,所以 SoftReference 引用的对象,它可能在其他处被强引用了。
User user = new User();
SoftReference<User> softReference = new SoftReference<>(user);
  1. 弱引用 WeakReference
  • 弱引用对象相对软引用对象具有更短暂的生命周期,只要 G C 发现它仅有弱引用,不管内存空间是否充足,都会回收它,不过 G C 是一个优先级很低的线程,因此不一定会很快发现那些仅有弱引用的对象。
  • 只有对象仅被 WeakReference 引用,它才是弱引用级别对象,因为对象可以在多处被引用,所以 WeakReference 引用的对象,它可能在其他处被强引用了。
User user = new User();
WeakReference<User> weakReference = new WeakReference<>(user);
  1. 虚引用 PhantomReference
  • 顾名思义,虚引用形同虚设,与其他几种引用不同,虚引用不会决定对象的生命周期。如果一个对象仅有虚引用,那它就和没有任何引用一样,任何时候都可能被 G C 回收.
  • PhantomReference使用get方法永远返回null,简单说就是「无法通过虚引用来获取对象的真实地址。
User user = new User();
PhantomReference<User> phantomReference = new PhantomReference<>(user);
  1. 小结
  • 虚引用图中,出现了ReferenceQueue(引用队列),引用队列是配合对象引用级别包装类(SoftReference、WeakReference、PhantomReference)使用,当对象引用级别包装类所指向的对象,被垃圾回收后,该对象引用级别包装类被追加到引用队列,因此可以通过引用队列做 G C 相关统计或额外数据清理等操作。
    在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值