【问题标题】:Use of clear in java.lang.ref.Reference class在 java.lang.ref.Reference 类中使用 clear
【发布时间】:2017-07-05 09:52:02
【问题描述】:
ReferenceQueue q = new ReferenceQueue();
Reference r = q.remove();
r.clear();

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

【问题讨论】:

  • 我删除了我的答案,因为在看到您对此的评论后,我很确定我没有正确解释我想要做什么。我会尝试以更好的方式做到这一点。

标签: java garbage-collection phantom-reference


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

    当您在尚未入队的Reference 对象上调用clear() 时,它可能允许收集所指对象而不使Reference 对象入队。另一方面,当你不再需要 Reference 对象时,你可以让 JVM 像普通对象一样收集它,如果没有其他引用,则连同所指对象一起收集,这样就不会了也不会被排队,从而使clear() 变得不必要。

    【讨论】:

      猜你喜欢
      • 2012-01-13
      • 2012-10-01
      • 2013-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多