Java GC - 小型GC收集是否是STW事件?

3
GC需要为Minor GC或Full GC停止整个应用程序吗?据我理解,当在Eden区没有可用空间来分配对象时,将发生一次Minor GC,那么这是否意味着每次Minor GC都会有一个STW事件?

1
通常是这样的。这也是为什么Eden空间应该相对较小的原因之一。(但你的推理是不正确的。) - Stephen C
谢谢您的回复,Stephen。不介意我问一下,为什么这个推理是不正确的呢? - Diego Ramos
1
是的,对于每个小型垃圾回收集,都会出现STW暂停。 更糟糕的是,在G1的情况下它不能是部分的,必须扫描所有年轻代。 - Eugene
2个回答

1
答案是“这取决于情况”。对于大多数现代Java收集器,小型(年轻/伊甸园空间)收集确实是一种阻塞全局的收集。这不是小GC触发年轻空间填满的直接逻辑结果。(可以采用其他策略来触发小型GC或处理年轻空间填充)。相反,这只是大多数Java GC实现的方式。
一个例外是ZGC,它不是分代的。因此,不存在小型收集的概念。相反,在触发GC时,会有一个短暂的(不到10ms)阻塞全局事件,同时找到GC根。第二个例外是Shenandoah GC,也同样不是分代的。
(当然,最初的Java 1.1 GC是标记-清除收集器,非分代和阻塞全局。)

1
我不明白“它取决于什么”的意思。目前没有一种分代收集器可以进行并发的小型收集。这是事实,而不是“取决于什么”。 - Eugene
不是事实,而是从一小组数据点中概括出来的。目前没有一种世代Java GC,其中次要收集不会停止整个系统,并不意味着不能有这样的GC存在。 - Stephen C
1
我必须承认这是一个相当有趣的观点,虽然并不意味着我同意,但你的观点仍然很有趣。 - Eugene

1
在阅读了几本书之后,我发现 Minor GC 总是一个“全局停顿”事件,它会停止所有应用线程,并且通常持续时间很短。相比之下,Full GC 的垃圾回收暂停时间要更长,因为它需要同时处理年轻代和老年代。所以无论是 Minor GC 还是 Full GC,都会导致全局停顿的事件发生。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接