弱引用是一种非强引用关系,通过WeakReference类实现,不阻止对象被垃圾回收。只要发生GC,即使内存充足,仅被弱引用指向的对象也会被立即回收。示例中,将obj置为null后只剩弱引用,调用System.gc()后weakRef.get()返回null。弱引用的回收发生在任意GC过程(包括Minor GC和Full GC),一旦JVM发现对象无强引用、软引用等存活依赖,便将其标记为可回收,清空弱引用并释放内存。该行为由JVM自动完成,不可预测。常见用途包括避免内存泄漏,如WeakHashMap使用弱引用作为键,当键无外部引用时条目自动移除;也用于监听器管理或缓存场景,确保不影响对象正常回收。核心特性是“不阻碍回收”,适合构建自动清理的轻量级引用。

弱引用在 Java 中通过 WeakReference 类实现,它不会阻止对象被垃圾回收器回收。只要垃圾回收器发现一个对象只有弱引用指向它,就会在下一次 GC 时立即回收该对象,而不需要等待多次扫描或执行 finalize 方法。
什么是弱引用?
弱引用是一种非强引用关系。使用 java.lang.ref.WeakReference 包装的对象,不会阻止垃圾回收器对该对象进行回收。一旦系统触发 GC,哪怕内存还够用,只要发现对象只被弱引用关联,就会将其标记为可回收。
示例:
Object obj = new Object();
WeakReference
弱引用的回收时机
弱引用对象的回收发生在任何一次垃圾回收过程中(包括 Minor GC 和 Full GC),只要 JVM 检测到对象没有强引用、软引用或其他方式保持存活,仅剩弱引用,就会:
- 将该对象加入回收队列
- 清空所有指向它的弱引用(即 weakRef.get() 返回 null)
- 释放其占用的堆内存
这个过程是自动且不可预测的,依赖于 JVM 的 GC 策略和运行状态。
立即学习“Java免费学习笔记(深入)”;
常见用途:避免内存泄漏
弱引用常用于构建缓存或映射表,希望数据能被自动清理,避免长期驻留内存。例如:
- WeakHashMap:键是弱引用,当键不再被外部引用时,整个条目可以被自动移除
- 监听器注册机制中防止对象无法释放
- 缓存中不希望影响对象生命周期的场景
比如 WeakHashMap 的典型使用:
Map cache = new WeakHashMap<>();
String key = new String("temp");
cache.put(key, new Object());
key = null;
System.gc();
// 下次访问 cache 可能已丢失该 entry
基本上就这些。弱引用的核心就是“不阻碍回收”,适合用来做轻量级、自动清理的引用关系。不复杂但容易忽略细节。











