我正在学习幻像引用,我很困惑当引用对象被垃圾收集时,幻像引用是如何排队的。
这是我的代码
Object s = new Object();
ReferenceQueue<Object> queue = new ReferenceQueue<Object>();
PhantomReference<Object> ref = new PhantomReference<Object>(s, queue);
s = null;
System.gc();
TimeUnit.SECONDS.sleep(1);
System.out.println(queue.poll());
正如预期的那样,queue.poll 将返回幻像引用:ref。
但是如果我对代码做一点改动:删除局部变量“ref”,queue.poll 将返回 null。
所以我可以推断,当 JVM 尝试对对象进行垃圾收集时,它会检查所有引用以查看是否有任何可以到达该对象的引用。
这应该是一个非常缓慢的进展。?
我设计了一个程序:使用幻像引用来跟踪资源泄漏。分配资源时,新建了一个幻像引用并绑定到资源。然后我发现:必须存储所有幻像引用,否则幻像引用不会入队。
我检查了netty代码,发现netty存储了所有幻像引用:io.netty.util.ResourceLeakDetector#allLeaks。