6

有一个问题 - JDK 7(G1 除外)中的所有 GC 是否总是使用 stop-the-world 进行年轻代收集?

谢谢

4

3 回答 3

11

对于 OpenJDK、JRockit、IBM JVM 和 Sun/Oracle JDK,对于每个可用的收集器,年轻的收集器总是停止世界。

我所知道的唯一没有停止世界收集器的 JVM 是 Azul 的 Zing。(不是免费的)

虽然 OpenJDK/Hotspot 有 CMS,但这主要是并发的。仍然存在 stop-the-world 部分,并且在某些情况下 CMS 将退回到完全 GC,即 stop-the-world。

AFAIK,很难找到 G1 在暂停时间方面比 CMS 更快的真实示例,但它一直在改进。

你的 GC 日志会跟你说话吗

于 2013-09-03T05:26:39.750 回答
5

所有(几乎)Java 垃圾收集器都有某种“停止世界”阶段,其中所有 Java 线程(不是本机线程)都被挂起,等待独占系统操作完成。这种状态有时被称为安全点。

现代垃圾收集器与应用程序线程同时运行,这意味着垃圾收集器在应用程序线程运行的同时执行其工作。在垃圾收集器过程中有需要独占访问内存的阶段,在该阶段应用程序 Java 线程进入安全点状态。

摆脱 stop-the-world 垃圾收集的一种替代方法是使用来自 Azul 系统的 C4 收集器的 Zing JVM。该实现具有低暂停方法,根本没有停止世界的集合。相反,它使用了一种没有停止世界阶段的并发压缩方法。

于 2013-09-03T05:32:52.967 回答
3

不,这不是真的。 Java 7 还支持较旧的并发标记扫描 (CMS) 收集器。CMS 是一个低暂停收集器,就像 G1 一样。

更新

显然 CMS 仅适用于终身...根据您在http://blogs.oracle.com/jonthecollector/entry/our_collectors找到的博客文章

所以这意味着你的提议实际上是正确的。


有人可能会争辩说,所有的低暂停收集器: - 需要停止 mutator 线程来完成它们的工作的某些阶段,并且 - 当它们无法跟上时,可能会使用标记/清除收集器退回到 Full GC。

但是,像 G1 和 CMS 这样的“大部分并发”收集器与在整个收集过程中暂停非 GC 线程的其他收集器之间存在质量差异。这就是“阻止世界”战略的通常含义。

于 2013-09-03T01:46:33.767 回答