在 Java 中,**弱引用(Weak Reference)**是 java.lang.ref.WeakReference 提供的一种引用类型,属于 四种引用强度 中的一种(强 > 软 > 弱 > 虚)。
下面从「工作方式」「生命周期」「使用场景」三个层面说明。
WeakReference<T> ref = new WeakReference<>(new Object());
只要发生垃圾回收(GC),弱引用指向的对象就会被回收
即使内存还很充足,也会回收。
示例:
Object obj = new Object();
WeakReference<Object> wr = new WeakReference<>(obj);
obj = null; // 去掉强引用
System.gc();
// 下一次 GC 后
System.out.println(wr.get()); // 很可能为 null
强引用存在 → 对象不会被回收
强引用消失 → 下次 GC 时对象被回收
WeakReference.get() → 返回对象或 null
弱引用常配合 ReferenceQueue 使用:
ReferenceQueue<Object> queue = new ReferenceQueue<>();
WeakReference<Object> wr = new WeakReference<>(new Object(), queue);
当对象被回收后:
WeakReference 本身会被放入队列WeakHashMap<Key, Value> map = new WeakHashMap<>();
✅ 适合:缓存、监听器管理
例如:
用弱引用持有对象,避免长期占用内存。
| 类型 | 回收时机 | 用途 |
|---|---|---|
| 强引用 | 不回收 | 普通对象 |
| 软引用 | 内存不足时 | 内存敏感缓存 |
| 弱引用 | 下次 GC | 自动清理、Map Key |
| 虚引用 | 随时 | 对象回收通知 |
❌ 弱引用 不能阻止 GC
❌ get() 可能随时返回 null
✅ 使用前应判空
Object o = wr.get();
if (o != null) {
// 使用对象
}
如果你愿意,我也可以:
你想深入哪一块?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。