在[使用软引用、弱引用、幽灵引用]时候,可以指定一个 ReferenceQueue 对象,它存储的是被回收数据对应的引用。
我们以为弱引用为例:
import java.lang.ref.Reference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.WeakReference;
public class Main {
public static void main(String[] args) throws InterruptedException {
ReferenceQueue<String> queue = new ReferenceQueue<>();
String data = new String("data");
WeakReference<String> dataRef = new WeakReference<>(data, queue);
System.out.println(dataRef);
data = null; // 解除强引用
// 触发垃圾回收
System.gc();
System.runFinalization();
// 查看哪些弱引用中的数据被回收了
while (true) {
Reference ref = queue.poll();
if (ref == null) {
break;
}
System.out.println("回收了: " + dataRef);
}
}
}
运行结果:
java.lang.ref.WeakReference@2f92e0f4
回收了: java.lang.ref.WeakReference@2f92e0f4