Java中的引用类型主要分为四种,它们决定了对象如何被垃圾回收器(GC)处理,适用于不同的内存管理场景:
1. 强引用(Strong Reference)
-
特点:最常见的引用类型。只要存在强引用指向对象,垃圾回收器绝不会回收该对象(即使内存不足时可能抛出
OutOfMemoryError)。 -
使用场景:普通对象赋值(默认引用类型)。
-
示例:
Object obj = new Object(); // obj是强引用
2. 软引用(Soft Reference)
-
特点:通过
SoftReference类实现。描述有用但非必需的对象。内存不足时,GC会回收软引用对象(在抛出OOM前清理)。 -
使用场景:实现内存敏感的缓存(如缓存图片、临时数据)。
-
示例:
SoftReference<Object> softRef = new SoftReference<>(new Object()); Object obj = softRef.get(); // 可能返回null(若被回收)
3. 弱引用(Weak Reference)
-
特点:通过
WeakReference类实现。描述非必需对象,无论内存是否充足,一旦发生GC就会被回收。 -
使用场景:避免内存泄漏(如
WeakHashMap的键引用)。 -
示例:
WeakReference<Object> weakRef = new WeakReference<>(new Object()); Object obj = weakRef.get(); // 可能已被回收
4. 虚引用(Phantom Reference)
-
特点:通过
PhantomReference类实现。无法通过虚引用访问对象(get()始终返回null),主要用于跟踪对象被回收的状态。必须与ReferenceQueue配合使用。 -
使用场景:在对象被回收时执行特定清理操作(如释放堆外内存)。
-
示例:
ReferenceQueue<Object> queue = new ReferenceQueue<>(); PhantomReference<Object> phantomRef = new PhantomReference<>(new Object(), queue); // 对象被回收时,phantomRef会被加入队列
引用队列(ReferenceQueue)
- 作用:软引用、弱引用、虚引用可关联引用队列。当对象被回收时,引用对象(如
SoftReference)会被加入队列,用于后续通知或清理操作。
总结
| 引用类型 | 回收时机 | 用途 |
|---|---|---|
| 强引用 | 永不回收(除非无强引用) | 默认对象引用 |
| 软引用 | 内存不足时回收 | 缓存 |
| 弱引用 | 每次GC时回收 | 避免内存泄漏(如WeakHashMap) |
| 虚引用 | 回收时跟踪 | 资源清理通知 |
理解不同引用类型的特点,可以优化内存管理并避免内存泄漏问题。