Java对象引用类型分强、软、弱、虚四种,强引用永不被GC回收,软引用在内存不足时回收,弱引用在每次GC时回收,虚引用仅用于回收通知且需配合ReferenceQueue。

Java 中的对象引用类型共有四种:强引用、软引用、弱引用和虚引用。它们的区别主要体现在垃圾回收(GC)时的处理策略上,决定了对象在内存紧张或特定时机是否被回收。合理使用这些引用类型,能帮助我们更精细地控制内存生命周期,尤其在缓存、监听器管理、资源清理等场景中非常关键。
强引用(Strong Reference)
最常见、默认的引用类型。只要强引用还存在,GC 就永远不会回收该对象。
- 写法示例:Object obj = new Object();
- 即使内存不足抛出 OutOfMemoryError,也不会回收强引用对象
- 适用于绝大多数常规对象,不需要特殊干预
软引用(SoftReference)
描述“有用但非必需”的对象。当系统内存不足时,GC 会优先回收软引用指向的对象,适合实现内存敏感的缓存。
- 写法示例:SoftReference
- GC 回收时机:内存不足时才触发,具体策略由 JVM 实现(如 HotSpot 倾向于保留最近使用的软引用对象)
- 获取对象需判空:Object obj = ref.get(); if (obj != null) { ... }
弱引用(WeakReference)
比软引用更“弱”,只存活到下一次 GC 开始前。无论内存是否充足,只要发生 GC,就会被回收。常用于避免内存泄漏,比如缓存、Map 键值绑定、监听器解注册等。
立即学习“Java免费学习笔记(深入)”;
- 写法示例:WeakReference
- 典型用途:WeakHashMap 的 key 就是弱引用,key 对象被回收后,对应 entry 自动失效
- 不保证对象存活时间,适合临时关联且不想阻止回收的场景
虚引用(PhantomReference)
最弱的一种引用,无法通过它获取对象实例(get() 总返回 null)。唯一作用是在对象被 GC 回收后收到系统通知,常配合 ReferenceQueue 实现资源清理逻辑。
- 写法示例:ReferenceQueue
- 必须与 ReferenceQueue 配合使用,否则无法感知回收事件
- 不能替代 finalize()(已弃用),但比 finalize 更可控、更安全
- 典型用途:堆外内存释放、文件句柄关闭等需要精确回收时机的操作
基本上就这些。四种引用本质是 JVM 提供的不同“持有强度”契约,不是语法糖,而是直接参与 GC 决策的底层机制。用对了能提升程序健壮性,用错了反而增加复杂度——日常开发中强引用占 95% 以上,其余三类按需谨慎引入即可。










