Java的五种引用

Java的五种引用

  • 强引用 不会回收

  • 是指创建一个对象并把这个对象赋给一个引用变量。

  • 强引用有引用变量指向时永远不会被垃圾回收,JVM宁愿抛出OutOfMemory错误也不会回收这种对象。

  • 如果想中断强引用和某个对象之间的关联,可以显示地将引用赋值为null

  • 软引用 内存不足即回收

  • 被SoftReference对象所引用的对象称为软引用对象,SoftReference对象调用get方法就会获取到它所软引用的那个对象。

  • 根对象强引用SoftReference对象,然后SoftReference对象软引用具体对象。
    在这里插入图片描述

  • 如下,变量m强引用SoftReference对象,然后SoftReference对象 软引用 一个byte数组。

SoftReference<byte[]> m = new SoftReference<>(new byte[1024*1024*10]);
System.out.println(m.get());
  • 软引用用来描述一些有用但非必须的对象, 当JVM进行垃圾回收时内存空间足够,垃圾回收器就不会回收软引用对象;但是当内存不够时会对软引用对象进行回收。软引用可用来实现内存敏感的高速缓存,比如网页缓存、图片缓存等。

  • 弱引用 发现即回收

  • 被WeakReference对象引用的对象称为弱引用对象,弱引用也是用来描述非必须对象的,当gc时,无论内存是否充足,都会回收被弱引用关联的对象。
    一个对象被弱引用和这个对象没有引用gc效果是一样的。它和完全没有引用的区别是,在垃圾回收之前我可以通过get访问到它。 弱引用在threadlocal中有实际应用场景。
    在这里插入图片描述

  • 虚引用 对象回收跟踪

  • 虚引用的gc效果与弱引用一样,当gc时,无论内存是否充足,都会回收虚引用关联的对象。
    在这里插入图片描述

  • 而且虚引用比弱引用还弱的一点是,即使没有垃圾回收,也无法访问虚引用对象。虚引用必须配合引用队列一起使用。

//引用队列
ReferenceQueue<byte[]> queue = new ReferenceQueue<>();
//创建虚引用对象的同时把该对象放入引用队列
PhantomReference<byte[]> m1 = new PhantomReference<>(new byte[1024*1024*10],queue);
System.out.println(m1.get());
  • 虚引用唯一的作用就是对垃圾回收过程进行跟踪,如果一个对象要被垃圾回收了,会向jvm发送一个通知,让jvm做其他事情。

  • 在jvm中对对外内存的回收就是利用虚引用来实现。具体看堆外内存管理部分。

  • 终结器引用

  • 终结器引用和虚引用的方式很类似,它用以实现对象的finalize()方法。 当一个对象重写了finalize方法,在第一次GC时,对应终结器引用进入引用队列队。由一个优先级很低的Finalizer线程通过终结器引用找到被引用对象并调用它的finalize()方法,第二次GC时才能回收被引用对象。

引用队列

  • 对于软引用 弱引用 虚引用来说,都是当被引用的实际对象回收时,将 软引用 弱引用
    虚引用对象本身放入引用队列,这样通过监控线程对引用队列进行检测就可以知

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值