JEP 366:弃用 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 组合的用户非常少。如果仍有大量用户使用此组合,则可能会重新考虑弃用。