为什么CMS full GC是单线程的?

Why is CMS full GC single-threaded?

每当使用 CMS 并发模式失败或提升失败时,它都会使用单线程执行完整 GC。为什么它不能使用并行收集器进行 full GC 以减少 full GC 惩罚?

除了没有以这种方式实现并且工程工作集中在 G1 之外,没有其他特别的原因。大多数 CMS 用户只是尝试以一种从未发生过的方式对其进行调整,"never" 意味着间隔大于需要 JVM 重新启动的时间间隔。由于收集器之间的内部数据结构不同,因此不能通过简单地调用其代码来重用并行旧收集器,因此这将涉及不平凡的实现工作。

Google 开发人员有 proposed a patch 为 CMS 贡献并行完整 GC,但我不指望它会很快在任何 openjdk 构建中可用。