- 强引用:发生 gc 的时候不会被回收。
- 软引用:有用但不是必须的对象,在发生内存溢出之前会被回收。
- 弱引用:有用但不是必须的对象,在下一次GC时会被回收。
- 虚引用(幽灵引用/幻影引用):无法通过虚引用获得对象,用 PhantomReference 实现虚引用,虚引用的用途是在 gc 时返回一个通知。
在Java中,有以下几种引用类型:
- 强引用(Strong Reference):强引用是最常见的引用类型。如果一个对象具有强引用与之相连,即使内存空间紧张,垃圾回收器也不会回收该对象。只有当强引用被显式地释放或者强引用变量被重新赋值为其他对象时,才会触发对象的回收。
Object obj = new Object(); // 强引用
- 软引用(Soft Reference):软引用用于描述一些还有用但非必需的对象。如果一个对象只有软引用与之相连,在内存空间不足时,垃圾回收器可能会回收该对象以释放内存。软引用可以通过 SoftReference 类来创建。
SoftReference<Object> softRef = new SoftReference<>(obj); // 软引用
- 弱引用(Weak Reference):弱引用用于描述非必需对象。如果一个对象只有弱引用与之相连,在下一次垃圾回收时,垃圾回收器可能会回收该对象。弱引用可以通过 WeakReference 类来创建。
WeakReference<Object> weakRef = new WeakReference<>(obj); // 弱引用
- 虚引用(Phantom Reference):虚引用是最弱的一种引用类型,主要用于对象被回收时收到系统通知,而不直接决定对象是否可达。虚引用可以通过 PhantomReference 类来创建。
ReferenceQueue<Object> queue = new ReferenceQueue<>();
PhantomReference<Object> phantomRef = new PhantomReference<>(obj, queue); // 虚引用
虚引用通常与 ReferenceQueue 配合使用,可以在对象被垃圾回收时收到通知,用于执行一些清理操作。
以上引用类型在Java中提供了不同级别的对象引用,可以根据实际需求选择合适的引用类型来管理对象的生命周期。