Java中的四种引用类型(强引用、软引用、弱引用、虚引用)通过不同策略控制对象生命周期,直接影响垃圾回收(GC)行为。以下是详细解析:
1. 强引用(Strong Reference)
- 特点:最常见的引用类型,只要强引用存在,对象绝不会被GC回收,即使内存不足也只会抛出
OutOfMemoryError
。 - 示例:
Object obj = new Object(); // 强引用 obj = null; // 显式断开强引用后,对象才可被回收
- 应用场景:普通对象引用,如局部变量或类成员变量。
2. 软引用(Soft Reference)
- 特点:内存充足时保留对象,内存不足时GC会回收。适合实现缓存(如图片缓存)。
- 实现类:
SoftReference
SoftReference<byte[]> softRef = new SoftReference<>(new byte[10_000_000]); System.out.println(softRef.get()); // 内存不足时可能返回null
- GC触发条件:JVM在抛出OOM前会回收所有软引用对象。
3. 弱引用(Weak Reference)
- 特点:无论内存是否充足,GC时立即回收。常用于监听对象回收(如
WeakHashMap
)。 - 实现类:
WeakReference
WeakReference<String> weakRef = new WeakReference<>("test"); System.gc(); // 强制GC后weakRef.get()通常返回null
- 扩展应用:配合
ReferenceQueue
可追踪对象回收事件。
4. 虚引用(Phantom Reference)
- 特点:无法通过虚引用获取对象,仅用于监听对象被回收后的系统通知。
- 实现类:
PhantomReference
(必须关联ReferenceQueue
)ReferenceQueue<Object> queue = new ReferenceQueue<>(); PhantomReference<Object> phantomRef = new PhantomReference<>(new Object(), queue); // 对象回收后,phantomRef会被加入queue
- 典型用途:管理堆外内存(如NIO的
DirectByteBuffer
)。
📌 引用强度与GC优先级总结
引用类型 | 回收条件 | 典型应用场景 |
---|---|---|
强引用 | 显式置为null 或超出作用域 | 常规对象引用 |
软引用 | 内存不足时 | 内存敏感缓存 |
弱引用 | 每次GC | 监听对象回收(如缓存键) |
虚引用 | 对象回收后通知 | 资源清理与堆外内存管理 |
通过这四种引用,开发者可以精细控制对象生命周期,平衡内存使用与性能。