Java 中的强引用、软引用、弱引用和虚引用分别是什么?
Java 中的引用类型:强引用、软引用、弱引用和虚引用
Java 中的引用类型主要分为 强引用、软引用、弱引用 和 虚引用,它们对对象的生命周期和垃圾回收(GC)行为产生不同的影响。
1. 强引用(Strong Reference)
定义
强引用是 Java 中最常见的引用类型。通过赋值操作符 =
创建的普通引用即为强引用。
特点
- 只要强引用存在,垃圾回收器(GC)就不会回收引用指向的对象。
- 强引用对象通常存储在堆内存中。
示例
public class StrongReferenceExample {
public static void main(String[] args) {
Object obj = new Object(); // 强引用
System.out.println(obj); // 强引用存在,obj 不会被回收
}
}
2. 软引用(Soft Reference)
定义
软引用是一种相对较弱的引用类型,可通过 java.lang.ref.SoftReference
类实现。
特点
- 软引用指向的对象在内存不足时才会被 GC 回收(适合实现缓存)。
- 软引用可以延长一些大对象的生命周期,直到 JVM 内存不足。
示例
import java.lang.ref.SoftReference;
public class SoftReferenceExample {
public static void main(String[] args) {
Object obj = new Object();
SoftReference<Object> softRef = new SoftReference<>(obj);
obj = null; // 去掉强引用
System.out.println(softRef.get()); // 软引用仍然可用
// 在内存不足时,softRef 可能会被回收
}
}
注意
- 软引用常用于实现内存敏感的缓存机制。
3. 弱引用(Weak Reference)
定义
弱引用是一种比软引用更弱的引用类型,可通过 java.lang.ref.WeakReference
类实现。
特点
- 只要 GC 发现弱引用对象没有强引用或软引用关联时,立即回收。
- 通常用于实现规范化映射(如
WeakHashMap
)。
示例
import java.lang.ref.WeakReference;
public class WeakReferenceExample {
public static void main(String[] args) {
Object obj = new Object();
WeakReference<Object> weakRef = new WeakReference<>(obj);
obj = null; // 去掉强引用
System.out.println(weakRef.get()); // 弱引用仍然可用
System.gc(); // 显式调用 GC
System.out.println(weakRef.get()); // 弱引用可能被回收,返回 null
}
}
注意
- 弱引用非常适合使用在缓存或动态代理中。
4. 虚引用(Phantom Reference)
定义
虚引用是一种最弱的引用类型,可通过 java.lang.ref.PhantomReference
类实现。
特点
- 虚引用不会决定对象的生命周期。
- 主要用于跟踪对象被回收的时间点。
- 虚引用必须与引用队列(
ReferenceQueue
)一起使用。
示例
import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;
public class PhantomReferenceExample {
public static void main(String[] args) {
Object obj = new Object();
ReferenceQueue<Object> queue = new ReferenceQueue<>();
PhantomReference<Object> phantomRef = new PhantomReference<>(obj, queue);
obj = null; // 去掉强引用
System.gc(); // 显式调用 GC
// 虚引用本身无法通过 get() 方法获取对象
System.out.println(phantomRef.get()); // 始终返回 null
}
}
注意
- 虚引用常用于清理工作或监控对象的回收状态。
5. 引用类型的对比
引用类型 | 描述 | 对 GC 的影响 | 适用场景 |
---|---|---|---|
强引用 | 默认的引用类型,对象存活取决于引用 | GC 永远不会回收 | 常规对象引用 |
软引用 | 内存不足时回收 | 内存不足时 GC 可能回收 | 缓存实现 |
弱引用 | 只要 GC 发现,立即回收 | 只要无强引用或软引用时,立即回收 | WeakHashMap、动态代理等 |
虚引用 | 无法直接访问对象,仅用于回收跟踪 | GC 回收后加入 ReferenceQueue | 清理资源、监控对象回收状态 |
6. 总结
- 强引用:最常见的引用类型,保证对象不被回收。
- 软引用:内存敏感的引用,适合缓存场景。
- 弱引用:短生命周期的引用,适合规范化映射或动态代理。
- 虚引用:仅用于监控对象的回收,适合清理或跟踪任务。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步