虚引用(PhantomReference)是最弱的一种引用,它唯一的作用是跟踪对象被垃圾回收的活动。虚引用与软引用和弱引用的区别在于:虚引用的get()方法总是返回null,意味着程序无法获得虚引用关联对象的实例。
虚引用的作用是:
- 无法通过虚引用访问对象,它仅用来跟踪对象被垃圾回收的过程。
- 对象被垃圾回收后,虚引用会收到系统通知,可以执行后续操作。这类似于对象的finalize()方法。
- 虚引用常用于对象回收后的后续处理,例如关闭与对象关联的文件等资源。
我们可以通过java.lang.ref.PhantomReference类来实现虚引用。构造方法为:
PhantomReference(T referent, ReferenceQueue<? super T> queue)
其中T是指向对象的类型,queue是关联的引用队列,用来接收对象被回收后的通知。
来看一个简单示例:
public class PhantomRefDemo {
private static ReferenceQueue<Object> queue = new ReferenceQueue<>();
public static void main(String[] args) {
Object obj1 = new Object();
PhantomReference<Object> ref1 = new PhantomReference<>(obj1, queue);
obj1 = null; // 可回收
System.gc();
Reference<? extends Object> ref = queue.poll();
if(ref != null) {
System.out.println("obj1已被回收");
}
}
}
执行结果为:
obj1已被回收
在该示例中:
- obj1作为虚引用ref1的关联对象,关联到引用队列queue。
- 设置obj1为null,使其成为垃圾。
- 显式调用GC,这时obj1被回收,queue会接收到通知。
- 从queue中poll出关联的虚引用,如果不为空,说明obj1已被回收。