四种引用与引用队列

强引用:Java程序平常使用的引用都是强引用,只要强引用还存在,垃圾收集器永远不会回收这些被引用的对象。

// 创建一个强引用
Object object = new Object();

软引用:描述一些还有用但非必需的对象。在系统要发生内存溢出之前,被软引用的对象将会被列入回收范围中进行第二次回收。在OutOfMemoryError之前,垃圾收集器会优先回收长时间闲置的软引用对象,对那些新创建的软对象会尽可能保留

软引用由SoftReference类表示:

// 创建一个强引用
Object object = new Object();
// 使用软引用去引用object对象
SoftReference<Object> softReference = new SoftReference<>(object);
// 去除强引用
object = null;
// 使用get()获取该软引用关联的对象
System.out.println(softReference.get());

软引用可用来实现内存敏感的高速缓存,比如浏览器的后退按钮,就可以使用软引用去关联前面浏览过的页面

弱引用:描述一些非必需的对象。被弱引用关联的对象只能存活到下一次垃圾回收发生之前,当垃圾回收器开始工作时,无论当前内存是否足够,都会回收掉只被弱引用关联的对象。

弱引用由WeakReference类表示:

 // 创建一个强引用
Object object = new Object();
// 使用弱引用去引用object对象
WeakReference<Object> weakReference = new WeakReference<>(object);
// 去除强引用
object = null;
System.out.println(weakReference.get()); // 输出:java.lang.Object@30c7da1e
// 调用gc
System.gc();
System.out.println(weakReference.get()); // 输出:null

如果一个对象很少被使用,并且希望在使用时随时就能获取到,但又不想影响此对象的垃圾收集,应该使用弱引用去关联此对象

虚引用:最弱的一种引用关系。一个对象是否由虚引用存在,都不会对其生存时间构成影响,也无法通过一个虚引用访问对象实例。设置虚引用的唯一目的是能在这个对象被垃圾收集器回收时收到一条通知。

虚引用要结合引用队列使用。由PhantomReference类表示:

// 创建一个强引用
Object object = new Object();
// 创建一个引用队列
ReferenceQueue<Object> objectReferenceQueue = new ReferenceQueue<>();
// 创建虚引用
PhantomReference<Object> phantomReference = new PhantomReference<>(object, objectReferenceQueue);
// 去除强引用
object = null;
// 虚引用获取不到关联的对象
System.out.println(phantomReference.get()); // 输出:null
// 调用gc
System.gc();
System.runFinalization();
// 判断回收
System.out.println(objectReferenceQueue.poll() == phantomReference); // 输出:true

引用队列:用于保存被回收后的对象引用。由ReferenceQueue类表示。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值