跳到主要内容

JEP 366:弃用 ParallelScavenge + SerialOld GC 组合

概括

弃用并行 Scavenge 和串行旧垃圾收集算法的组合。

非目标

  • 删除这个 GC 组合并不是我们的目标。

  • 我们的目标不是弃用任何其他 GC 组合。

动机

我们认为有一种 GC 算法组合很少使用,但需要大量的维护工作:并行年轻代 GC(称为 ParallelScavenge)和串行旧代 GC(称为 SerialOld)的配对。用户必须使用-XX:+UseParallelGC -XX:-UseParallelOldGC命令行选项专门启用此组合。

这种组合很不寻常,因为它将并行年轻代和串行老年代 GC 算法配对。我们认为这种组合仅适用于具有非常大的年轻代和非常小的老年代的部署。在这种情况下,由于老年代的大小较小,完整的收集暂停时间可能是可以忍受的。实际上,这是一种非常罕见且危险的部署,因为年轻代中对象的活跃度的轻微变化将导致OutOfMemoryException,因为老一代比年轻代小得多。与对年轻代和老年代使用并行 GC 算法相比,这种组合的唯一优点是总内存使用量略低。我们认为,这种较小的内存占用优势(最多约为 Java 堆大小的 3%)不足以抵消维护此 GC 组合的成本。

描述

除了弃用选项组合之外,-XX:+UseParallelGC -XX:-UseParallelOldGC我们还将弃用选项-XX:UseParallelOldGC,因为它的唯一用途是取消选择并行老年代GC,从而启用串行老年代GC。

因此,任何显式使用该UseParallelOldGC选项都会显示弃用警告。特别是,当-XX:+UseParallelOldGC独立使用(不带-XX:+UseParallelGC)来选择并行年轻代和老年代 GC 算法时,将会显示警告。

在没有弃用警告的情况下选择并行年轻代和老年代 GC 算法的唯一方法是仅-XX:+UseParallelGC在命令行上指定。

备择方案

唯一的变化是弃用消息;没有功能损失。现有的名为“Parallel”的收集器结合了并行年轻代和并行老年代算法,具有几乎相同的行为,应该是直接替代品。

风险和假设

我们假设这种 GC 组合的用户很少。如果该组合仍有大量用户,则可能会重新考虑弃用。