java参数注解 读懂Java的Reference和ReferenceQueue

2周前 (09-22)

Java中的Reference和ReferenceQueue是用于管理对象引用的重要类。Reference是一个抽象类,它有四个子类:WeakReference、SoftReference、PhantomReference和FinalReference。ReferenceQueue是一个用于收集被垃圾回收器回收的Reference对象的队列。

我们来了解一下Reference类。Reference类是一个抽象类,它用于创建引用类型的对象。引用对象分为强引用、软引用、弱引用和虚引用四种类型。强引用是最常见的引用类型,它可以让对象始终存在于内存中,直到被主动释放或者程序结束。软引用是一种比较灵活的引用类型,当内存不足时,垃圾回收器会将其回收。弱引用是一种比软引用更加脆弱的引用类型,在垃圾回收时会被回收。虚引用是一种最弱的引用类型,它几乎不对对象的生命周期产生任何影响,主要用于在对象被回收时收到系统通知。

我们来了解一下ReferenceQueue类。ReferenceQueue是用于收集被垃圾回收器回收的Reference对象的队列。当一个Reference对象被垃圾回收器回收时,如果该Reference对象注册了ReferenceQueue,则会将该Reference对象放入ReferenceQueue中。通过检查ReferenceQueue,我们可以知道哪些对象已经被垃圾回收器回收。可以通过Reference对象的get方法来获取被引用的对象。

下面是使用Reference和ReferenceQueue的示例代码:

```java

import java.lang.ref.Reference;

import java.lang.ref.ReferenceQueue;

import java.lang.ref.WeakReference;

public class ReferenceExample {

public static void main(String[] args) {

Object obj = new Object(); // 创建一个对象

ReferenceQueue referenceQueue = new ReferenceQueue<>(); // 创建一个ReferenceQueue

WeakReference weakRef = new WeakReference<>(obj, referenceQueue); // 创建一个WeakReference,并将obj和referenceQueue传入

obj = null; // 将obj置为null,使其可以被垃圾回收器回收

Reference<> ref = null;

while ((ref = referenceQueue.poll()) != null) { // 检查ReferenceQueue是否有被回收的Reference对象

if (ref == weakRef) {

System.out.println("WeakReference被回收");

}

}

}

}

```

在上面的示例代码中,我们首先创建了一个对象obj,并将其作为参数传入了WeakReference的构造函数中。我们将obj置为null,使其可以被垃圾回收器回收。在循环中,我们通过referenceQueue.poll()方法不断地从ReferenceQueue中获取被回收的Reference对象。如果获取到的Reference对象与之前创建的WeakReference对象相同,则说明WeakReference对象已经被回收了。

通过使用Reference和ReferenceQueue,我们可以更加灵活地管理对象引用和监控对象的垃圾回收情况。这在一些需要对对象生命周期进行精确控制的场景中非常有用,比如对象缓存、对象池等。