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

我看到 java 文档说该clear方法清除了这个引用对象。我不明白这是什么意思。这是否clear来自内存,换句话说,对象已被垃圾收集?

4

2 回答 2

0

java.lang.Reference是少数特殊引用的基类,这些特殊引用由垃圾收集以特殊方式处理。

在某些情况下,垃圾收集器可能会将引用对象推送到它的引用队列中(引用可能在生命周期中只排队一次)。

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

github 上的这个项目PhantomReference有一个使用s 用于教育目的的资源管理实现。clear()如果显式处理资源以避免在这种情况下为 GC 做额外的工作,则使用。

于 2017-07-10T10:14:10.743 回答
0

clear()只需将内部引用设置为null. 由于引用在被垃圾收集器排入队列时会自动清除(幻像引用除外,但这种奇怪之处可以忽略,它将在 Java 9 中消除),通常不需要调用clear()通过ReferenceQueue.remove().

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

当您调用尚未入队的对象时,它可能允许收集所指对象而无需将该clear()对象入队。另一方面,当你不再需要对象时,你可以让 JVM 像普通对象一样收集它,如果没有其他引用,则与引用一起收集,这样就不会入队同样,使不必要的。ReferenceReferenceReferenceclear()

于 2017-07-12T18:05:11.863 回答