【发布时间】:2018-11-12 13:41:29
【问题描述】:
让我们看看与垃圾收集速度相关的潜在竞争条件。
初始状态:
main => a
a => b
b => c
main 程序引用对象 a,对象 a 引用 b,b参考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