1、强引用(Strong Reference)
强引用是最常见的引用类型。如果一个对象具有强引用,那么垃圾回收器就不会回收它。只有当强引用不再指向一个对象时,该对象才会被垃圾回收。内存不足时,即使出现OOM(内存溢出)也不会回收强引用的对象。
例如:
Object obj = new Object(); // 强引用
2、软引用(Soft Reference)
软引用主要用于实现内存敏感的缓存。只有在内存不足时,垃圾回收器才会回收被软引用关联的对象。软引用通常用于实现一些可有可无的大对象,如果内存充足,则保留这些对象;如果内存不足,则回收这些对象以节省内存空间。
例如:
import java.lang.ref.SoftReference; Object obj = new Object(); // 强引用
SoftReference<Object> softRef = new SoftReference<>(obj); // 软引用
3、弱引用(Weak Reference)
弱引用用于实现非必需对象的内存释放。只要垃圾回收器运行,无论内存是否足够,都会被回收。弱引用通常用于实现一些生命周期较短的对象,或者关联较大的对象,以便在不影响程序运行的情况下尽快回收内存。
例如:
import java.lang.ref.WeakReference; Object obj = new Object(); // 强引用
WeakReference<Object> weakRef = new WeakReference<>(obj); // 弱引用
4、虚引用(Phantom Reference)
虚引用也主要用于跟踪对象被垃圾回收的状态。虚引用对对象本身的操作影响力非常小,无法改变对象的生命周期。主要和引用队列联合使用,在finalize之前会被放到引用队列中。虚引用通常用于在垃圾回收器准备回收一个对象之前执行某些操作,如关闭文件、释放网络资源等。
例如:
import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;
import java.io.Closeable;
import java.io.IOException;
class Closer extends Closeable {
private PhantomReference<Object> phantomRef;
private ReferenceQueue<Object> refQueue;
public Closer(Object obj, ReferenceQueue<Object> refQueue) {
this.phantomRef = new PhantomReference<>(obj, refQueue); // 虚引用
this.refQueue = refQueue;
}
@Override
public void close() throws IOException {
phantomRef = null; // 清除虚引用,使其不能再被访问到
try {
refQueue.remove(); // 从队列中移除此虚引用对象,以便垃圾回收器可以回收它所指向的对象
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
super.close(); // 关闭资源,如文件、网络连接等
}
}
}