1. Java 中的引用类型
Java 提供了四种引用类型,用于控制对象的生命周期和垃圾回收行为:
- 强引用(Strong Reference):
- 默认的引用类型,只要强引用存在,对象就不会被垃圾回收。
- 例如:
Object obj = new Object();
- 软引用(Soft Reference):
- 由
SoftReference
类表示。 - 在内存不足时,垃圾回收器会回收软引用对象。
- 由
- 弱引用(Weak Reference):
- 由
WeakReference
类表示。 - 无论内存是否充足,垃圾回收器都会回收弱引用对象。
- 由
- 虚引用(Phantom Reference):
- 由
PhantomReference
类表示。 - 用于跟踪对象被垃圾回收的状态,必须与
ReferenceQueue
配合使用。
- 由
2. WeakReference
的特点
- 定义:
WeakReference
是一种弱引用类型,用于引用对象,但不会阻止垃圾回收器回收该对象。- 当垃圾回收器运行时,如果对象只有弱引用,则该对象会被回收。
- 使用场景:
- 适用于缓存场景,当内存不足时,允许缓存对象被回收。
- 常用于实现弱缓存(如
WeakHashMap
)。
3. SoftReference
的特点
- 定义:
SoftReference
是一种软引用类型,用于引用对象,但在内存不足时,垃圾回收器会回收该对象。- 只有在内存不足时,软引用对象才会被回收。
- 使用场景:
- 适用于缓存场景,希望缓存对象在内存充足时保留,但在内存不足时释放。
- 常用于实现内存敏感的缓存(如图片缓存)。
4. WeakReference
与 SoftReference
的区别
特性 | WeakReference | SoftReference |
---|---|---|
回收时机 | 无论内存是否充足,垃圾回收器都会回收 | 只有在内存不足时,垃圾回收器才会回收 |
适用场景 | 弱缓存(如 WeakHashMap ) | 内存敏感的缓存(如图片缓存) |
内存敏感度 | 不敏感,对象容易被回收 | 敏感,对象在内存充足时保留 |
示例 | WeakReference<Object> weakRef = new WeakReference<>(obj); | SoftReference<Object> softRef = new SoftReference<>(obj); |
5. 使用 ReferenceQueue
WeakReference
和 SoftReference
都可以与 ReferenceQueue
配合使用,用于跟踪对象被垃圾回收的状态。
示例:
ReferenceQueue<Object> queue = new ReferenceQueue<>();
Object obj = new Object();
WeakReference<Object> weakRef = new WeakReference<>(obj, queue);
obj = null; // 取消强引用
System.gc(); // 建议 JVM 执行垃圾回收
Reference<?> ref = queue.poll();
if (ref != null) {
System.out.println("对象已被回收");
}
6. 总结
引用类型 | 回收时机 | 适用场景 |
---|---|---|
WeakReference | 无论内存是否充足,都会回收 | 弱缓存(如 WeakHashMap ) |
SoftReference | 只有在内存不足时,才会回收 | 内存敏感的缓存(如图片缓存) |
关键点:
WeakReference
和SoftReference
都是用来控制对象的生命周期和垃圾回收行为。WeakReference
无论内存是否充足都会被回收,适用于弱缓存。SoftReference
只有在内存不足时才会被回收,适用于内存敏感的缓存。- 两者都可以与
ReferenceQueue
配合使用,跟踪对象被回收的状态。
THE END
暂无评论内容