1

我对 java 中的 PhantomReference 有点困惑。当我查看在线文章时,他们中的大多数都提到 PhantomReference 对象在创建后将返回 null 即使我们在引用上调用 get() 并且它还提到当 PhantomReference 被删除时,对象是幻影可访问的将被插入到 ReferenceQueue 中记忆。

我已经尝试了以下代码示例,但我对结果感到困惑。

Equipment equipment = new Equipment();  
ReferenceQueue queue = new ReferenceQueue();  
PhantomReference pr = new PhantomReference(equipment, queue);

System.out.println(pr.get());  
System.out.println(queue.poll()); 

以上两个语句打印空。如果 pr.get() 返回 null 是否意味着 pr 引用的对象被垃圾收集?如果是这样,为什么对象仍未添加到优先级队列中?

任何人都可以帮助我澄清这一点。如果我对 PhantomReference 和 ReferenceQueue 的理解有误,我向您道歉。

请简单描述这两个术语

多谢

4

1 回答 1

2

PhantomReference#get() 总是返回null

返回此引用对象的所指对象。因为幻影引用的所指对象始终不可访问,所以此方法始终返回 null。

你无法知道它是否是通过 收集的get()

如果是这样,为什么对象仍然没有添加到优先级队列中

javadoc状态_

如果垃圾收集器在某个时间点确定幻影引用的所指对象是幻影可到达的,那么在那个时间或稍后的某个时间它将将该引用加入队列。

poll()因此,要么在调用(非阻塞)时实例尚未被垃圾收集,要么实例已被垃圾收集,但相应PhantomReference的未添加到ReferenceQueue.

您可以通过设置强引用null并请求 GC 来帮助它,但也可以阻止队列中remove的GC。Reference

equipment = null;
System.out.println(pr.get());
System.gc();
System.out.println(queue.remove()); // block and wait for it to be added
于 2014-10-08T15:44:05.287 回答