在 Java 中,弱引用(WeakReference) 要“生效”,核心在于 被弱引用指向的对象,在没有强引用时,会在下一次垃圾回收时被回收。下面从原理、使用方式、生效条件和典型示例逐步说明。
Java 的引用类型(强 → 弱 → 软 → 虚):
Object o = new Object(),不会回收import java.lang.ref.WeakReference;
public class WeakDemo {
public static void main(String[] args) {
Object obj = new Object();
WeakReference<Object> weakRef = new WeakReference<>(obj);
obj = null; // 去掉强引用
System.gc(); // 建议 JVM 进行 GC
if (weakRef.get() == null) {
System.out.println("对象已被回收");
}
}
}
✅ 生效条件:
WeakHashMapWeakHashMap<Key, Value> map = new WeakHashMap<>();
✅ 常用于:
当对象被回收后,弱引用本身可以进入队列:
ReferenceQueue<Object> queue = new ReferenceQueue<>();
WeakReference<Object> ref = new WeakReference<>(new Object(), queue);
// GC 后
Reference<?> poll = queue.poll();
用途:
❌ 1. 还持有强引用
Object obj = new Object();
WeakReference<Object> ref = new WeakReference<>(obj);
System.gc();
// obj 还在,不会回收
❌ 2. GC 没真正发生
System.gc() 只是“建议”❌ 3. 对象被 static 引用
static Object obj;
| 场景 | 原因 |
|---|---|
| 缓存 | 防止内存泄漏 |
| ThreadLocal | JDK 内部使用弱引用 |
| 监听器 | 自动清理 |
| 元数据 | 不影响主对象生命周期 |
Java 弱引用的“生效” = 对象无强引用 + GC 发生 → 对象被回收
如果你愿意,我也可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。