在java.lang.ref.Reference类中使用clear

时间:2017-07-05 09:52:03

标签: java garbage-collection phantom-reference

ReferenceQueue q = new ReferenceQueue();
Reference r = q.remove();
r.clear();

我看到java doc说clear方法清除了这个引用对象。我不明白这个意思。这个clear来自内存,因此换句话说该对象是垃圾收集的吗?

2 个答案:

答案 0 :(得分:0)

java.lang.Reference是几个特殊引用的基类,通过垃圾收集以特殊方式处理。

在某些情况下,垃圾收集器可能会在其引用队列中推送引用对象(引用可能在一生中仅排队一次)。

clear()方法可用于抑制特殊处理(因此垃圾收集器的附加工作)。如果引用对象已经在队列中,则清除它是没有意义的,它已被垃圾收集器清除。

github上的

This project使用PhantomReference进行资源管理实现,用于教育目的。如果明确处置资源以避免在这种情况下为GC做额外工作,则使用clear()

答案 1 :(得分:0)

clear()只是将内部引用设置为null。由于引用在被垃圾收集器排队时自动清除(除了幻像引用,但这种奇怪之处可以忽略,它将在Java 9中被删除),通常不需要在一个上调用clear()通过ReferenceQueue.remove()收到的参考资料。

原则上,有可能通过enqueue()手动排队引用而不清除它们,但是没有意义,因为引用队列的主要目的是了解引用被垃圾排队的引用将 清除的收集器。

当您在尚未加入队列的clear()对象上调用Reference时,它可能允许在不将Reference对象排入队列的情况下收集所述对象。另一方面,当你不再需要Reference对象时,如果没有其他引用,你可以让JVM像普通对象一样收集它,就像在那种情况下一样,它也不会排队,因此不需要clear()