ReferenceQueue q = new ReferenceQueue();
Reference r = q.remove();
r.clear();
我看到 java 文档说该clear
方法清除了这个引用对象。我不明白这是什么意思。这是否clear
来自内存,换句话说,对象已被垃圾收集?
ReferenceQueue q = new ReferenceQueue();
Reference r = q.remove();
r.clear();
我看到 java 文档说该clear
方法清除了这个引用对象。我不明白这是什么意思。这是否clear
来自内存,换句话说,对象已被垃圾收集?
java.lang.Reference
是少数特殊引用的基类,这些特殊引用由垃圾收集以特殊方式处理。
在某些情况下,垃圾收集器可能会将引用对象推送到它的引用队列中(引用可能在生命周期中只排队一次)。
clear()
方法可用于抑制特殊处理(因此垃圾收集器的额外工作)。如果引用对象已经在队列中,那么清除它没有意义,它已经被垃圾收集器清除了。
github 上的这个项目PhantomReference
有一个使用s 用于教育目的的资源管理实现。clear()
如果显式处理资源以避免在这种情况下为 GC 做额外的工作,则使用。
clear()
只需将内部引用设置为null
. 由于引用在被垃圾收集器排入队列时会自动清除(幻像引用除外,但这种奇怪之处可以忽略,它将在 Java 9 中消除),通常不需要调用clear()
通过ReferenceQueue.remove()
.
原则上,可以通过手动将引用排入enqueue()
队列而不清除它们,但这没有什么意义,因为引用队列的主要目的是了解被垃圾收集器排入队列的引用,这些引用将被清除。
当您调用尚未入队的对象时,它可能允许收集所指对象而无需将该clear()
对象入队。另一方面,当你不再需要对象时,你可以让 JVM 像普通对象一样收集它,如果没有其他引用,则与引用一起收集,这样就不会入队同样,使不必要的。Reference
Reference
Reference
clear()