WeakReference(弱引用)在 Java 等具备垃圾回收机制的语言中,用来引用对象但不阻止其被 GC 回收。只要对象只被弱引用指向,下一次 GC 就可能回收它。
下面按使用场景系统说明:
最常见场景:内存敏感型缓存
WeakReference<BigObject> ref = new WeakReference<>(new BigObject());
配合 WeakHashMap 使用更方便:
Map<Key, Value> cache = new WeakHashMap<>();
✅ 适用:
监听器如果强引用外部对象,容易导致无法回收。
class Listener {
WeakReference<Target> targetRef;
}
✅ 适用:
例如:
Map<Object, WeakReference<MetaInfo>> map;
主对象死了,元信息也可回收。
ThreadLocalMap 使用 WeakReference<ThreadLocal<?>>:
例如:
| 引用类型 | GC 行为 | 使用场景 |
|---|---|---|
| Strong | 不回收 | 正常对象 |
| Soft | 内存不足才回收 | 内存敏感缓存 |
| Weak | 下次 GC 就回收 | 临时缓存、防泄漏 |
| Phantom | 仅通知 GC | 资源清理 |
BigObject obj = ref.get();
if (obj != null) {
// 使用
}
BigObject obj = new BigObject();
WeakReference<BigObject> ref = new WeakReference<>(obj);
// obj 仍强引用,不会被回收
WeakReference 适合:不想阻止对象被回收,但又想“顺便用一下”它的场景。
如果你愿意,我也可以:
WeakHashMap 源码ReferenceQueue 用法免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。