Java中的四种引用类型详解
字数 1179 2025-11-04 08:34:41
Java中的四种引用类型详解
描述
Java提供了四种不同强度的引用类型:强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)和虚引用(Phantom Reference)。这些引用类型决定了对象如何被垃圾回收器(GC)处理,是实现内存敏感缓存、避免内存泄漏的重要机制。
知识详解
-
强引用(Strong Reference)
- 定义:最常见的引用类型,通过
new关键字创建的对象默认都是强引用。 - 特点:只要强引用存在,垃圾回收器就永远不会回收被引用的对象。即使内存不足时,JVM抛出
OutOfMemoryError也不会回收强引用对象。 - 示例:
Object obj = new Object(); // obj是强引用 - 回收条件:将引用赋值为
null或超出作用域后,对象才会被回收。
- 定义:最常见的引用类型,通过
-
软引用(Soft Reference)
- 定义:通过
SoftReference类实现,描述还有用但非必需的对象。 - 特点:在内存充足时不会被回收;当内存不足时(GC后仍无法分配内存),这些对象会被回收。适用于实现内存敏感缓存。
- 示例:
SoftReference<byte[]> softRef = new SoftReference<>(new byte[10 * 1024 * 1024]); byte[] data = softRef.get(); // 获取对象,若被回收则返回null - 适用场景:图片缓存、网页缓存等。
- 定义:通过
-
弱引用(Weak Reference)
- 定义:通过
WeakReference类实现,比软引用更弱。 - 特点:无论内存是否充足,只要发生垃圾回收,弱引用对象就会被回收。
- 示例:
WeakReference<Object> weakRef = new WeakReference<>(new Object()); System.gc(); // 触发GC后,weakRef.get()很可能返回null - 典型应用:
WeakHashMap中的键是弱引用,常用于缓存键值对(如线程上下文映射)。
- 定义:通过
-
虚引用(Phantom Reference)
- 定义:通过
PhantomReference类实现,必须与引用队列(ReferenceQueue)联合使用。 - 特点:
- 虚引用无法通过
get()方法获取对象(总是返回null)。 - 唯一作用是在对象被回收时收到系统通知(通过引用队列)。
- 虚引用无法通过
- 示例:
ReferenceQueue<Object> queue = new ReferenceQueue<>(); PhantomReference<Object> phantomRef = new PhantomReference<>(new Object(), queue); // 当对象被回收时,phantomRef会被加入queue - 使用场景:管理堆外内存(如NIO的DirectBuffer),确保资源被回收后执行清理操作。
- 定义:通过
对比与总结
| 引用类型 | 回收时机 | 获取对象 | 用途 |
|---|---|---|---|
| 强引用 | 永不回收(除非无引用) | 直接获取 | 普遍对象 |
| 软引用 | 内存不足时 | get() |
内存敏感缓存 |
| 弱引用 | GC时立即回收 | get() |
易失性缓存(如WeakHashMap) |
| 虚引用 | GC时(通知机制) | 总是返回null |
资源清理跟踪 |
注意事项
- 软引用和弱引用通常与
ReferenceQueue配合,用于跟踪对象被回收的状态。 - 虚引用必须结合
ReferenceQueue使用,常用于替代finalize()方法(因finalize不稳定且低效)。