java 基础 - WeakReference 和 ReferenceQueue

what 什么是weakReference和ReferenceQueue?

weakReference表示弱引用,其实就是包装了一个强引用,GC的时候,这个被包装的强引用能被释放掉。如果有ReferenceQueue的话,在释放的时候就把这个Reference放到ReferenceQueue里面,ReferenceQueue里面其实维护的就是Reference的链表而已。

从引用链的角度来说,Reference中引用了包装的对象和ReferenceQueue,Reference包装的对象被回收的时候,Reference被放到了ReferenceQueue维护的链表当中,也就是说Reference还有个queueNext字段指向了Queue链表中的Reference,如果是末尾,自己指向自己。

How 怎么用?

       ReferenceQueue<Object> referenceQueue = new ReferenceQueue<>();
        WeakReference<Object> weakReference = new WeakReference(new Object(), referenceQueue);
        Object obj = weakReference.get();

Why 为什么要用呢?

弱引用的好处就是GC的时候能够断开引用,如果没有其它引用,对象就被回收了,所以可以解决内存泄漏问题。

Reference和ReferenceQueue一块使用可以,检测内存泄漏问题,比如LeakCanary。

 

 

说到内存泄漏,不得不说到WeakReference

(源码)详细分析Android中的引用机制Reference(WeakReference、SoftReference、PhantomReference)

Android对Reference的源码进行了改动,下面是的对Java版的说明

java 源码系列 - 带你读懂 Reference 和 ReferenceQueue

这篇文章推荐阅读的文章都得学习一下

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个使用ReferenceQueue的示例代码: ``` import java.lang.ref.Reference; import java.lang.ref.ReferenceQueue; import java.lang.ref.WeakReference; public class ReferenceQueueDemo { public static void main(String[] args) { Object obj = new Object(); ReferenceQueue<Object> referenceQueue = new ReferenceQueue<>(); WeakReference<Object> weakReference = new WeakReference<>(obj, referenceQueue); // 检查弱引用是否被加入到了ReferenceQueue中 new Thread(() -> { while (true) { Reference<?> ref = referenceQueue.poll(); if (ref != null) { System.out.println("Weak reference is garbage collected: " + ref); } } }).start(); // 立即清除强引用 obj = null; System.gc(); // 等待一段时间以便垃圾回收完成 try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } ``` 在这个示例中,我们创建了一个Object对象,并将其封装在一个WeakReference中。我们同时创建了一个ReferenceQueue对象,用于存放被垃圾回收的引用对象。在一个单独的线程中,我们不断地检查ReferenceQueue中是否有弱引用对象被回收了。 接着,我们立即将强引用obj设为null,并手动调用System.gc()方法,以便触发垃圾回收。最后,我们等待一段时间以便垃圾回收完成。 在这个示例中,我们通过使用ReferenceQueue来监控弱引用对象是否被回收,从而及时进行必要的清理工作。如果垃圾回收器回收了弱引用对象,那么该对象将会被加入到ReferenceQueue中,并且我们可以在另一个线程中对其进行处理。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值