会,但不是“一定会立刻回收”,而是在特定条件下由 GC 回收。
弱引用是通过 java.lang.ref.WeakReference 创建的引用:
Object obj = new Object();
WeakReference<Object> weakRef = new WeakReference<>(obj);
obj = null; // 去掉强引用
会。
当对象只被弱引用指向,没有任何强引用或软引用指向它时,
下一次垃圾回收(GC)发生时,这个对象就会被回收。
关键点:
| 引用类型 | 是否会被回收 | 回收时机 |
|---|---|---|
| 强引用 | ❌ 不会 | 永远不回收(直到无引用) |
| 软引用 | ✅ 会 | 内存不足时 |
| 弱引用 | ✅ 会 | 下次 GC 就回收 |
| 虚引用 | ✅ 会 | 随时,主要用于跟踪回收 |
“弱引用一定会被回收”
❌ 不准确
如果还没发生 GC,或者还有强引用,就不会回收。
Object a = new Object();
WeakReference<Object> w = new WeakReference<>(a);
// a 还活着,弱引用不会回收
WeakHashMap(key 是弱引用)Object obj = new Object();
WeakReference<Object> weak = new WeakReference<>(obj);
obj = null;
System.gc(); // 建议 GC(不保证立刻)
if (weak.get() == null) {
System.out.println("对象已被回收");
}
✅ 总结一句话:
Java 弱引用在对象没有强引用、且发生 GC 时会被回收。
如果你想知道 WeakHashMap 为什么用弱引用 或 ThreadLocal 为什么可能内存泄漏,我也可以详细讲。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。