在 Java 中,**弱引用(WeakReference)**的回收时机可以概括为:
当垃圾回收器(GC)运行时,只要对象只被弱引用关联(没有任何强引用),该对象就会被回收。
下面分点说明:
ReferenceQueue(如果有的话)示例:
Object obj = new Object();
WeakReference<Object> weakRef = new WeakReference<>(obj);
obj = null; // 去掉强引用
// 此时只有 weakRef 指向对象
// GC 发生后,对象可能被回收
System.gc();
⚠️ 注意:
obj = null;
// 不保证马上回收
即使没有强引用,也可能暂时还在内存中。
| 引用类型 | 回收条件 |
|---|---|
| 强引用 | 永不回收(直到无引用) |
| 软引用 | 内存不足时回收 |
| 弱引用 | 下次 GC 就回收 |
| 虚引用 | 随时可能回收(仅用于跟踪) |
使用 ReferenceQueue:
ReferenceQueue<Object> queue = new ReferenceQueue<>();
WeakReference<Object> ref = new WeakReference<>(new Object(), queue);
// GC 后
Reference<?> removed = queue.poll(); // 可感知回收
❌ 弱引用对象“创建后就很快消失”
✅ 实际是:只要 GC 发生且无可达强引用,才会回收
❌ System.gc() 一定立刻回收
✅ 只是“建议”GC,不保证
如果你愿意,我也可以结合 WeakHashMap 源码 或 ThreadLocal 中的弱引用 给你讲具体回收过程。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。