1. 强引用(Strong Reference)
强引用是最常见的引用类型,它使用普通的对象引用来指向一个对象。只要存在强引用指向一个对象,即使内存不足(抛出OOM异常),垃圾回收器也不会回收该对象。
// 创建一个强引用
Object obj = new Object();
// 强引用仍然存在,对象不会被垃圾回收
System.out.println(obj);
图片来源:Java中的四种引用类型(java基础:你真的掌握了吗?) - 掘金
2. 软引用(Soft Reference)
软引用是一种相对较弱的引用类型。当内存不足时,垃圾回收器可能会回收被软引用指向的对象。软引用通常用于实现内存敏感的缓存,当内存不足时,可以通过回收软引用指向的对象来释放内存。
import java.lang.ref.SoftReference;
// 创建一个软引用
SoftReference<Object> softRef = new SoftReference<>(new Object());
// 获取软引用指向的对象
Object obj = softRef.get();
// 当内存不足时,垃圾回收器可能回收软引用指向的对象
图片来源:Java中的四种引用类型(java基础:你真的掌握了吗?) - 掘金
3. 弱引用(Weak Reference)
弱引用比软引用更弱,当垃圾回收器扫描到只有弱引用指向的对象时,无论内存是否充足,都会立即回收该对象。“一经发现,立即回收。”弱引用通常用于实现在对象被回收时进行特定操作的场景。
import java.lang.ref.WeakReference;
// 创建一个弱引用
WeakReference<Object> weakRef = new WeakReference<>(new Object());
// 获取弱引用指向的对象
Object obj = weakRef.get();
// 当垃圾回收器扫描到只有弱引用指向的对象时,会回收该对象
4. 虚引用(Phantom Reference)
虚引用是最弱的一种引用类型。与其他引用类型不同,虚引用并不能通过get()方法获取到引用的对象,主要用于跟踪对象被垃圾回收的状态。虚引用通常用于对象被回收后进行一些清理操作的场景。
import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;
// 创建一个引用队列
ReferenceQueue<Object> referenceQueue = new ReferenceQueue<>();
// 创建一个虚引用,并关联到引用队列上
PhantomReference<Object> phantomRef = new PhantomReference<>(new Object(), referenceQueue);
// 当对象被回收时,会将虚引用添加到引用队列中
Java中4种引用的级别由高到低依次为:强引用 > 软引用 > 弱引用 > 虚引用。
这些引用类型在Java中提供了不同的回收机制和灵活性,可以根据具体的需求选择合适的引用类型来管理对象的生命周期。需要注意的是,软引用、弱引用和虚引用都继承自java.lang.ref.Reference类,并且需要使用java.lang.ref包中的相关类来处理这些引用类型。
相关参考