ReferenceQueue q = new ReferenceQueue();
Reference r = q.remove();
r.clear();
我看到java doc说clear
方法清除了这个引用对象。我不明白这个意思。这个clear
来自内存,因此换句话说该对象是垃圾收集的吗?
答案 0 :(得分:0)
java.lang.Reference
是几个特殊引用的基类,通过垃圾收集以特殊方式处理。
在某些情况下,垃圾收集器可能会在其引用队列中推送引用对象(引用可能在一生中仅排队一次)。
clear()
方法可用于抑制特殊处理(因此垃圾收集器的附加工作)。如果引用对象已经在队列中,则清除它是没有意义的,它已被垃圾收集器清除。
This project使用PhantomReference
进行资源管理实现,用于教育目的。如果明确处置资源以避免在这种情况下为GC做额外工作,则使用clear()
。
答案 1 :(得分:0)
clear()
只是将内部引用设置为null
。由于引用在被垃圾收集器排队时自动清除(除了幻像引用,但这种奇怪之处可以忽略,它将在Java 9中被删除),通常不需要在一个上调用clear()
通过ReferenceQueue.remove()
收到的参考资料。
原则上,有可能通过enqueue()
手动排队引用而不清除它们,但是没有意义,因为引用队列的主要目的是了解引用被垃圾排队的引用将 清除的收集器。
当您在尚未加入队列的clear()
对象上调用Reference
时,它可能允许在不将Reference
对象排入队列的情况下收集所述对象。另一方面,当你不再需要Reference
对象时,如果没有其他引用,你可以让JVM像普通对象一样收集它,就像在那种情况下一样,它也不会排队,因此不需要clear()
。