在 Java 中,弱引用(Weak Reference)是 java.lang.ref.WeakReference 提供的一种比软引用更弱的引用类型,用来描述“只要发生垃圾回收,就会被回收的对象”。
下面从概念、机制、用途和示例几个层面说清楚。
从强到弱:
强引用(Strong Reference)
Object o = new Object();
只要强引用存在,GC 永远不会回收。
软引用(SoftReference)
弱引用(WeakReference)
虚引用(PhantomReference)
弱引用对象不会阻止它所指向的对象被垃圾回收
换句话说:
Object obj = new Object();
WeakReference<Object> weakRef = new WeakReference<>(obj);
obj = null; // 去掉强引用
System.gc();
System.out.println(weakRef.get()); // 很可能输出 null
public class WeakReference<T> extends Reference<T> {
public WeakReference(T referent);
public T get(); // 返回引用对象,已被回收则返回 null
}
WeakHashMap 就是基于弱引用实现的:
WeakHashMap<Key, Value> map = new WeakHashMap<>();
✅ 适合:生命周期由外部决定的缓存
例如:
WeakReference<Listener> listenerRef = new WeakReference<>(listener);
当 listener 不再被使用,GC 可自动清理,避免内存泄漏。
Java 中:
ThreadLocalMap 的 key 是 WeakReference但注意:
value 不是弱引用,所以仍可能内存泄漏(需手动 remove)
| 特性 | 弱引用 | 软引用 |
|---|---|---|
| GC 时是否回收 | ✅ 一定回收 | ❌ 内存不足才回收 |
| 生命周期 | 极短 | 较长 |
| 用途 | 防泄漏、关联对象 | 缓存 |
❌ “弱引用对象本身会被回收”
✅ 是被引用的对象会被回收
❌ “弱引用一定马上被回收”
✅ 是在 GC 发生时才回收
弱引用是一种“不阻碍垃圾回收”的引用方式,用来安全地关联对象,常用于缓存、监听器和避免内存泄漏。
如果你愿意,我可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。