有一个问题 - JDK 7(G1 除外)中的所有 GC 是否总是使用 stop-the-world 进行年轻代收集?
谢谢
对于 OpenJDK、JRockit、IBM JVM 和 Sun/Oracle JDK,对于每个可用的收集器,年轻的收集器总是停止世界。
我所知道的唯一没有停止世界收集器的 JVM 是 Azul 的 Zing。(不是免费的)
虽然 OpenJDK/Hotspot 有 CMS,但这主要是并发的。仍然存在 stop-the-world 部分,并且在某些情况下 CMS 将退回到完全 GC,即 stop-the-world。
AFAIK,很难找到 G1 在暂停时间方面比 CMS 更快的真实示例,但它一直在改进。
所有(几乎)Java 垃圾收集器都有某种“停止世界”阶段,其中所有 Java 线程(不是本机线程)都被挂起,等待独占系统操作完成。这种状态有时被称为安全点。
现代垃圾收集器与应用程序线程同时运行,这意味着垃圾收集器在应用程序线程运行的同时执行其工作。在垃圾收集器过程中有需要独占访问内存的阶段,在该阶段应用程序 Java 线程进入安全点状态。
摆脱 stop-the-world 垃圾收集的一种替代方法是使用来自 Azul 系统的 C4 收集器的 Zing JVM。该实现具有低暂停方法,根本没有停止世界的集合。相反,它使用了一种没有停止世界阶段的并发压缩方法。
不,这不是真的。 Java 7 还支持较旧的并发标记扫描 (CMS) 收集器。CMS 是一个低暂停收集器,就像 G1 一样。
更新
显然 CMS 仅适用于终身...根据您在http://blogs.oracle.com/jonthecollector/entry/our_collectors找到的博客文章
所以这意味着你的提议实际上是正确的。
有人可能会争辩说,所有的低暂停收集器: - 需要停止 mutator 线程来完成它们的工作的某些阶段,并且 - 当它们无法跟上时,可能会使用标记/清除收集器退回到 Full GC。
但是,像 G1 和 CMS 这样的“大部分并发”收集器与在整个收集过程中暂停非 GC 线程的其他收集器之间存在质量差异。这就是“阻止世界”战略的通常含义。