1

我知道它告诉 CMS 收集器在发生完整 GC 时对旧代进行压缩。

但我想确认我是否理解正确(从各种来源拼凑而成):

完整的 GC 会暂停世界,收集并压缩旧代(使用 CMS 的备注阶段的结果),然后收集年轻代,提升对象(如果有的话),然后恢复世界。

此时,old gen 中可能有浮动垃圾,UseCMSCompactAtFullCollection就是清理它们并再次压缩 old gen(基本上是 old gen 上的另一个 GC)。因为无论如何世界都停止了,所以做更多的压缩可能是值得的。

这个描述正确吗?我错过了任何重要的细节吗?谢谢

4

1 回答 1

0

这张票是一个很好的答案:https ://bugs.openjdk.java.net/browse/JDK-8027132

基本上,我的理解是正确的。当分配失败时,有一个前台 CMS 模式会从后台模式中恢复(因为在解决失败之前系统无法继续)。

-XX:+UseCMSCompactAtFullCollection告诉前台模式使用串行旧的运行压缩。它对完整的 GC 没有影响。

Java 8 中不推荐使用前台模式(现在运行完整的 GC 是唯一的选择),标志也是如此。

结论

国旗已经死了,不要使用它。

于 2015-12-31T18:17:16.887 回答