阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

强引用、软引用、弱引用、虚引用有什么区别?

40次阅读
没有评论

共计 1058 个字符,预计需要花费 3 分钟才能阅读完成。

导读 自 JDK1.2 开始,Java 提供了 4 种引用关系,以表示引用和实例对象的关系。
强引用“一直存活着”

强引用,就是我们最常见的普通对象引用。
只要强引用还存在,垃圾收集器永远不会回收掉被引用的实例对象。

Object o = new Object();
软引用“有 n 次活的机会”

在系统将要发生内存溢出异常之前,垃圾收集器会把只被软引用关联着的实例对象进行回收,如果这次回收还没有足够的内存,才会抛出内存溢出异常(OutOfMemoryError)。

  1. 软引用通常用来实现内存敏感的缓存:
  2. 如果还有空闲内存,就可以暂时保留缓存;
  3. 如果内存不足,则清理掉缓存;

这样就保证了使用缓存的同时,不会耗尽内存。

SoftReference<Object> softO = new SoftReference<>(new Object());
虚引用“随时可能被回收”

虚引用也称为“幽灵引用”或者“幻影引用”,虚引用是最弱的一种引用关系。
在 Java 8 以及之前的版本中,在虚引用回收后,虚引用指向的对象才会回收。
在 Java 9 以及更新的版本中,虚引用不会对对象的生存时间产生任何影响。
无法通过虚引用来获取一个实例对象。虚引用主要用来跟踪对象被垃圾回收的活动,回收对象关联的资源。
在 Java8 以及之前的版本中,当垃圾收集器准备回收一个实例对象时,如果发现它还有虚引用,就会在回收实例对象之前,把这个虚引用加入到与之关联的引用队列中。程序如果发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存被回收之前采取必要的行动,然后断开虚引用对象的引用,虚引用被回收或者不可达,虚引用指向的对象才会回收。

Object counter = new Object();
ReferenceQueue refQueue = new ReferenceQueue<>();
PhantomReference<Object> p = new PhantomReference<>(counter, refQueue);
counter = null;
System.gc();
try {
// Remove 是一个阻塞方法,可以指定 timeout,或者选择一直阻塞
Reference<Object> ref = refQueue.remove(1000L);
if (ref != null) {
// do something

ref = null;
}
} catch (InterruptedException e) {// Handle it}

阿里云 2 核 2G 服务器 3M 带宽 61 元 1 年,有高配

腾讯云新客低至 82 元 / 年,老客户 99 元 / 年

代金券:在阿里云专用满减优惠券

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2024-07-25发表,共计1058字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中