【问题标题】:Enforcing JVM GC - for a good reason (I hope)强制执行 JVM GC - 有充分的理由(我希望)
【发布时间】:2018-11-12 13:41:29
【问题描述】:

让我们看看与垃圾收集速度相关的潜在竞争条件。

初始状态:

main => a
a => b
b => c

ma​​in 程序引用对象 a,对象 a 引用 bb参考c。现在,我们想让 a 引用 c 而不是 b

好:

a => c

由于不再引用 b,它可以被垃圾回收。

不好:

a = null
a => c

在这两个步骤之间(将 a 设置为 null 并将其重新指向 c),b 可能会与c。我怀疑这些错误可能会被单元测试发现,因为 GC 很可能不会运行得足够快而遇到麻烦。检测问题的一种方法是强制执行 GC,或者至少增加其频率。是否有任何命令行参数或其他方法?如果没有,我们还有哪些其他自动化方法可以防止此类错误?

【问题讨论】:

  • 鉴于描述的“手部波动”,回答您的问题并不容易。一个特定的代码示例会更有用。也就是说,仅仅因为没有提到“b”并不意味着它是可收藏的。要被收集,“b”必须从任何垃圾收集根中“无法访问”。这是一个关于它如何工作的很好的讨论。 dynatrace.com/resources/ebooks/javabook/…
  • 我会研究 Java 的 AtomicReference
  • 如果你没有提到c,你将如何分配a = c;

标签: java garbage-collection jvm


【解决方案1】:

你完全错了。即使“在这两个步骤之间”,也有对c somewhere 的引用(提示:google for GC 根)。

您的描述意味着所有运行 java 的服务器肯定会快速崩溃,但不存在这样的问题。

【讨论】:

    【解决方案2】:

    如果您在 A 中设置引用以引用 C,那么 C 怎么可能在您的程序中没有引用(至少是局部变量或其他东西)您是凭空获得 C 吗?垃圾收集器甚至不会考虑使用 C 进行垃圾收集。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-03
      • 1970-01-01
      • 1970-01-01
      • 2017-11-06
      • 1970-01-01
      • 2019-06-27
      • 1970-01-01
      • 2017-04-08
      相关资源
      最近更新 更多