面试题:Java 中 WeakReference 与 SoftReference 的区别?

1. Java 中的引用类型

Java 提供了四种引用类型,用于控制对象的生命周期和垃圾回收行为:

  1. 强引用(Strong Reference)
    • 默认的引用类型,只要强引用存在,对象就不会被垃圾回收。
    • 例如:Object obj = new Object();
  2. 软引用(Soft Reference)
    • 由 SoftReference 类表示。
    • 在内存不足时,垃圾回收器会回收软引用对象。
  3. 弱引用(Weak Reference)
    • 由 WeakReference 类表示。
    • 无论内存是否充足,垃圾回收器都会回收弱引用对象。
  4. 虚引用(Phantom Reference)
    • 由 PhantomReference 类表示。
    • 用于跟踪对象被垃圾回收的状态,必须与 ReferenceQueue 配合使用。

2. WeakReference 的特点

  • 定义
    • WeakReference 是一种弱引用类型,用于引用对象,但不会阻止垃圾回收器回收该对象。
    • 当垃圾回收器运行时,如果对象只有弱引用,则该对象会被回收。
  • 使用场景
    • 适用于缓存场景,当内存不足时,允许缓存对象被回收。
    • 常用于实现弱缓存(如 WeakHashMap)。

3. SoftReference 的特点

  • 定义
    • SoftReference 是一种软引用类型,用于引用对象,但在内存不足时,垃圾回收器会回收该对象。
    • 只有在内存不足时,软引用对象才会被回收。
  • 使用场景
    • 适用于缓存场景,希望缓存对象在内存充足时保留,但在内存不足时释放。
    • 常用于实现内存敏感的缓存(如图片缓存)。

4. WeakReference 与 SoftReference 的区别

特性WeakReferenceSoftReference
回收时机无论内存是否充足,垃圾回收器都会回收只有在内存不足时,垃圾回收器才会回收
适用场景弱缓存(如 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
点赞9 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容