目录

大橙子

VX:ZzzChChen
Phone:13403656751
Email:zxydczzs@gmail.com

X

Java 中强引用、软引用、弱引用、虚引用的区别

在 Java 中,对象的引用类型决定了垃圾回收器(GC)如何处理该对象。强引用、软引用、弱引用、虚引用 的区别主要体现在 对象的生命周期管理垃圾回收行为 上。以下是它们的核心区别和应用场景。

强引用

  • 定义:默认的引用类型,例如:

    1Object obj = new Object();
    
  • 特点

    • 只要存在强引用指向对象,垃圾回收器永远不会回收该对象。
    • 如果内存不足,JVM 会抛出 OutOfMemoryError,而不会回收强引用对象。
  • 应用场景:日常开发中的普通对象引用。

软引用

  • 定义:通过 SoftReference 类实现,例如:
    1SoftReference<Object> softRef = new SoftReference<>(new Object());
    
  • 特点:
    • 当内存不足时,GC 会回收软引用对象(在抛出 OutOfMemoryError 之前)。
    • 适合实现内存敏感的缓存,例如缓存图片、临时数据等。
  • 应用场景:缓存数据(如 Tomcat 的缓存机制)。

弱引用

  • 定义:通过 WeakReference 类实现,例如:
    1WeakReference<Object> weakRef = new WeakReference<>(new Object());
    
  • 特点:
    • 无论内存是否充足,一旦发生 GC,弱引用对象就会被回收。
    • 适合实现易失性缓存,例如 WeakHashMap 的键(Key)。
  • 应用场景:监听器、临时映射表(如 WeakHashMap)。

虚引用

  • 定义:通过 PhantomReference 类实现,必须与引用队列(ReferenceQueue)配合使用:
    1ReferenceQueue<Object> queue = new ReferenceQueue<>();
    2PhantomReference<Object> phantomRef = new PhantomReference<>(new Object(), queue);
    
  • 特点:
    • 无法通过虚引用获取对象实例(get()方法始终返回 null)。
    • 虚引用仅用于跟踪对象被回收的状态,当对象被回收时,虚引用会被加入关联的引用队列。
    • 适合在对象回收时执行精确的资源清理操作(如关闭文件句柄)。
  • 应用场景:管理堆外内存(如 DirectByteBuffer 的清理)。

对比总结

引用类型 回收条件 是否可获取对象 应用场景 示例类
强引用 永不回收(除非无强引用) 普通对象 Object obj = ...
软引用 内存不足时回收 缓存 SoftReference
弱引用 发生 GC 时立即回收 易失性缓存、监听器 WeakReference
虚引用 对象被回收后通知 资源清理、堆外内存管理 PhantomReference

引用队列(ReferenceQueue)

  • 作用:软引用、弱引用、虚引用都可以关联一个 ReferenceQueue,当引用的对象被回收时,引用本身会被加入队列。
  • 典型用途:监控对象回收状态,执行后续清理逻辑。

实例代码

 1// 软引用示例
 2SoftReference<byte[]> softRef = new SoftReference<>(new byte[1024]);
 3byte[] data = softRef.get(); // 可能为 null(如果被回收)
 4
 5// 弱引用示例
 6WeakReference<Object> weakRef = new WeakReference<>(new Object());
 7System.gc();
 8System.out.println(weakRef.get()); // 可能为 null
 9
10// 虚引用示例(必须结合引用队列)
11ReferenceQueue<Object> queue = new ReferenceQueue<>();
12PhantomReference<Object> phantomRef = new PhantomReference<>(new Object(), queue);
13System.gc();
14Reference<?> ref = queue.remove(); // 阻塞直到虚引用被回收

核心去呗

  1. 强引用:对象存活的基础。
  2. 软引用:内存不足时的缓存。
  3. 弱引用:GC 触发即回收的临时数据。
  4. 虚引用:仅用于跟踪对象回收事件。

通过灵活使用这些引用类型,可以优化内存管理,避免内存泄漏,同时实现高效的资源回收策略。


标题:Java 中强引用、软引用、弱引用、虚引用的区别
作者:zzzzchen
地址:https://dczzs.com/articles/2025/03/25/1742896528084.html