【问题标题】:Contradiction in WeakReference's Java documentationWeakReference 的 Java 文档中的矛盾
【发布时间】:2014-12-13 20:01:28
【问题描述】:

这个问题是关于理解 WeakReference 的 Java 文档

当我阅读 Java 的 WeakReference 时,我在文档中看到了这句话:

假设垃圾收集器在某个时间点确定 对象弱可达的时间。到时候就会 原子地清除对该对象的所有弱引用和所有弱引用 对任何其他弱可达对象的引用 对象可通过一系列强引用和软引用访问

但这对我来说没有意义。假设我有一个引用对象 A 的 WeakReference wrA 和另一个引用对象 B 的 WeakReference wrB。并且 B 强烈引用 A(直接或间接通过链)。现在根据文档,如果A变得弱可达,而B此时已经弱可达,那么wrB将与wrA一起被清除。但是,既然此时B已经是弱可达的,那wrB不应该在第一次检测到B的弱可达的时候就已经清零了吗?

【问题讨论】:

  • 因为那时 B 已经很弱可达 -- 这个事实可能直到现在都没有被发现,不是吗?
  • 重新措辞可能是个好主意,因为似乎很难弄清楚问题到底出在哪里。

标签: java weak-references


【解决方案1】:

既然此时B已经是弱可达的,那wrB是不是应该在第一次检测到B的弱可达的时候就已经清零了?

这是同时发生的,所以没有更早的时间。当 GC 启动时,所有当时不可强可达的对象(例如 A 和 B)都有资格被清理。

【讨论】:

  • 感谢您的回答。我认为这更像是文档中的演示文稿。我只是不相信通过首先检测 A 检测到另一个弱可达对象 A 的路径上的弱可达对象 B 比仅检测 B 本身更好。但我不知道 GC 使用的图形算法,我认为实现可以选择它喜欢的任何顺序,无论是否有效。
  • @user690421 文档没有具体说明这一点,JVM 可以选择任何合适的方式。我怀疑您所做的区分没有用,无论哪种方式,您最终都会得到相同的解决方案。关于 A 的要点是,即使它有一个强引用,它也可以被清理,因为它来自一个弱引用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-22
  • 2021-09-30
  • 2014-10-29
  • 1970-01-01
  • 2023-03-10
  • 2020-11-18
  • 1970-01-01
相关资源
最近更新 更多