










在 Java 中,引用(Reference) 是对象与内存之间的关联方式,JDK 1.2 后将引用分为 强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)、虚引用(Phantom Reference) 四类,核心目的是灵活控制对象的垃圾回收(GC)行为,适配不同的内存使用场景。
日常开发中最常用的引用方式,只要对象被强引用关联,JVM 就不会回收该对象,即使内存耗尽抛出 OutOfMemoryError,也不会主动回收强引用对象。
// 强引用:obj 是指向 Object 对象的强引用
Object obj = new Object();
java.lang.ref 包的类;List<Object> list = new ArrayList<>(); list.add(new Object()); 只要 list 不被清空 / 置空,其中的 Object 就不会被回收。通过 java.lang.ref.SoftReference 类实现,是「内存敏感」的引用:
OutOfMemoryError。import java.lang.ref.SoftReference;
public class SoftReferenceDemo {
public static void main(String[] args) {
ReferenceQueue 配合:当软引用对象被 GC 回收后,软引用本身会被加入 ReferenceQueue,便于后续清理;通过 java.lang.ref.WeakReference 类实现,比软引用更「弱」:
import java.lang.ref.WeakReference;
public class WeakReferenceDemo {
public static void main(String[] args) {
WeakHashMap:键(Key)是弱引用类型,当键的强引用断开后,GC 会回收键值对,避免内存泄漏;ThreadLocal:内部通过 ThreadLocalMap 存储数据,ThreadLocalMap 的键是弱引用的 ThreadLocal 对象,防止 ThreadLocal 长期持有导致内存泄漏;通过 java.lang.ref.PhantomReference 类实现,是最弱的引用类型,无法通过虚引用获取对象本身(get() 方法永远返回 null),仅用于「跟踪对象被 GC 回收的事件」。
ReferenceQueue 配合使用:当虚引用关联的对象被 GC 回收时,虚引用会被加入 ReferenceQueue,程序通过监听 ReferenceQueue 感知对象已回收;finalize())的不足。import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;
public class PhantomReferenceDemo {
public static void main(String[] args) throws InterruptedException {
DirectByteBuffer 会占用堆外内存,虚引用可跟踪其回收,确保堆外内存被及时释放;finalize():finalize() 执行时机不可控,且可能导致对象复活,虚引用是更可靠的对象回收回调方式。Object obj = new Object());java.lang.ref 包的对应类包装,其中虚引用必须配合 ReferenceQueue;System.gc() 一定会触发 GC?
❌ 纠正:System.gc() 只是向 JVM 发送 GC 建议,JVM 可忽略(如新生代内存充足时),因此弱 / 软引用的回收时机不可精确控制;ReferenceQueue 手动清理,否则会导致 Reference 对象堆积;get() 方法永远返回 null,仅能通过 ReferenceQueue 感知对象回收。此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。