在 Java 中,弱引用(WeakReference) 是四种引用类型之一(强、软、弱、虚),它的核心特点是:
只要发生垃圾回收(GC),被弱引用指向的对象就会被回收,无论内存是否充足。
弱引用常用于缓存、监听器、映射表等场景,防止对象因为被“无意持有”而无法回收。
典型例子:WeakHashMap
WeakHashMap<Key, Value> map = new WeakHashMap<>();
✅ 非常适合做临时缓存
弱引用允许你:
Object obj = new Object();
WeakReference<Object> weakRef = new WeakReference<>(obj);
obj = null;
// 可能还能拿到
Object o = weakRef.get();
一旦 GC:
o == null
ReferenceQueue<Object> queue = new ReferenceQueue<>();
WeakReference<Object> ref = new WeakReference<>(new Object(), queue);
当对象被回收时:
| 引用类型 | 是否阻止 GC | 典型用途 |
|---|---|---|
| 强引用 | ✅ 阻止 | 普通对象 |
| 软引用 | ❌ 内存不足才回收 | 内存敏感缓存 |
| 弱引用 | ❌ 一定回收 | 防泄漏、临时映射 |
| 虚引用 | ❌ 仅通知 | 精确回收控制 |
listenerMap.put(obj, new WeakReference<>(listener));
ThreadLocalMap 使用 弱引用指向 key❌ 弱引用不等于自动清理
❌ 不适合做“重要缓存”
Java 弱引用的作用:在不阻止对象被回收的前提下,仍然可以临时访问它,主要用于防止内存泄漏和实现轻量级缓存。
如果你愿意,我也可以结合 ThreadLocal、WeakHashMap 源码 或 实际内存泄漏案例 给你讲。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。