Java对象引用类型有哪些_OOP引用分类与使用说明

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

Java 中的对象引用类型共有四种:强引用、软引用、弱引用和虚引用。它们的区别主要体现在垃圾回收(GC)时的处理策略上,决定了对象在内存紧张或特定时机是否被回收。合理使用这些引用类型,能帮助我们更精细地控制内存生命周期,尤其在缓存、监听器管理、资源清理等场景中非常关键。

强引用(Strong Reference)

最常见、默认的引用类型。只要强引用还存在,GC 就永远不会回收该对象。

  • 写法示例:Object obj = new Object();
  • 即使内存不足抛出 OutOfMemoryError,也不会回收强引用对象
  • 适用于绝大多数常规对象,不需要特殊干预

软引用(SoftReference)

描述“有用但非必需”的对象。当系统内存不足时,GC 会优先回收软引用指向的对象,适合实现内存敏感的缓存。

  • 写法示例:SoftReference ref = new SoftReference(new Object());
  • GC 回收时机:内存不足时才触发,具体策略由 JVM 实现(如 HotSpot 倾向于保留最近使用的软引用对象)
  • 获取对象需判空:Object obj = ref.get(); if (obj != null) { ... }

弱引用(WeakReference)

比软引用更“弱”,只存活到下一次 GC 开始前。无论内存是否充足,只要发生 GC,就会被回收。常用于避免内存泄漏,比如缓存、Map 键值绑定、监听器解注册等。

  • 写法示例:WeakReference ref = new WeakReference(new Object());
  • 典型用途:WeakHashMap 的 key 就是弱引用,key 对象被回收后,对

    应 entry 自动失效
  • 不保证对象存活时间,适合临时关联且不想阻止回收的场景

虚引用(PhantomReference)

最弱的一种引用,无法通过它获取对象实例(get() 总返回 null)。唯一作用是在对象被 GC 回收后收到系统通知,常配合 ReferenceQueue 实现资源清理逻辑。

  • 写法示例:ReferenceQueue queue = new ReferenceQueue();
    PhantomReference ref = new PhantomReference(new Object(), queue);
  • 必须与 ReferenceQueue 配合使用,否则无法感知回收事件
  • 不能替代 finalize()(已弃用),但比 finalize 更可控、更安全
  • 典型用途:堆外内存释放、文件句柄关闭等需要精确回收时机的操作

基本上就这些。四种引用本质是 JVM 提供的不同“持有强度”契约,不是语法糖,而是直接参与 GC 决策的底层机制。用对了能提升程序健壮性,用错了反而增加复杂度——日常开发中强引用占 95% 以上,其余三类按需谨慎引入即可。