JEP 366: Deprecate the ParallelScavenge + SerialOld GC Combination | 弃用 ParallelScavenge + SerialOld GC 组合
摘要
弃用 Parallel Scavenge 和 Serial Old 垃圾收集算法的组合。
非目标
本提案的目标不是移除这种 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 组合的用户非常少。如果这种组合的用户数量仍然很多,可能会重新考虑弃用。