欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 手游 > JVM 中的四类引用:强、软、弱、虚

JVM 中的四类引用:强、软、弱、虚

2025/2/11 13:25:10 来源:https://blog.csdn.net/xxxmine/article/details/145501421  浏览:    关键词:JVM 中的四类引用:强、软、弱、虚

导言
在 Java 开发中,垃圾收集(GC)机制通过自动管理内存提升了开发效率。但你是否知道 JVM 通过四种引用类型(强、软、弱、虚)精细控制对象生命周期?

强引用(Strong Reference)

特征:默认引用类型,只要强引用存在,对象绝不会被 GC 回收。

public class StrongReferenceDemo {public static void main(String[] args) {Object obj = new Object(); // 强引用System.out.println("GC前: " + obj);obj = null; // 切断强引用System.gc(); // 建议JVM执行GCSystem.out.println("GC后: " + obj);}
}

输出

GC前: java.lang.Object@15db9742
GC后: null

解析:将 obj 置为 null 后,原对象失去强引用,GC 会回收其内存。

软引用(SoftReference) 

特征:内存不足时,GC 会回收软引用对象。适合实现缓存。

public class SoftReferenceDemo {public static void main(String[] args) {SoftReference<byte[]> softRef = new SoftReference<>(new byte[10 * 1024 * 1024]); // 10MBSystem.out.println("GC前: " + softRef.get());System.gc();System.out.println("内存充足GC后: " + softRef.get());// 分配更多内存,触发内存不足byte[] newAllocation = new byte[15 * 1024 * 1024]; System.out.println("内存不足时: " + softRef.get());}
}

运行参数-Xmx20M 限制堆内存为 20MB

输出

GC前: [B@6d06d69c
内存充足GC后: [B@6d06d69c 
内存不足时: null

弱引用(WeakReference)

特征:无论内存是否充足,GC 时立即回收。

public class WeakReferenceDemo {public static void main(String[] args) {WeakReference<Object> weakRef = new WeakReference<>(new Object());System.out.println("GC前: " + weakRef.get());System.gc();System.out.println("GC后: " + weakRef.get());}
}

输出

GC前: java.lang.Object@7852e922
GC后: null

虚引用(PhantomReference)

特征:无法通过虚引用访问对象,必须配合 ReferenceQueue 使用,用于追踪对象回收。

public class PhantomReferenceDemo {public static void main(String[] args) throws InterruptedException {ReferenceQueue<Object> queue = new ReferenceQueue<>();PhantomReference<Object> phantomRef = new PhantomReference<>(new Object(), queue);System.out.println("PhantomRef.get(): " + phantomRef.get()); // 始终为nullSystem.gc();Thread.sleep(500);Reference<?> ref = queue.poll();if (ref != null) {System.out.println("对象已被回收,通过队列通知");}}
}

输出

PhantomRef.get(): null
对象已被回收,通过队列通知

应用场景:管理堆外内存(如 NIO 的 DirectBuffer),确保资源释放。

四类引用对比总结

引用类型回收时机常见用途
强引用永不回收(除非不可达)普通对象创建
软引用内存不足时内存敏感缓存
弱引用下次GC时缓存、WeakHashMap
虚引用对象回收后资源清理跟踪

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com