JEP 214: Remove GC Combinations Deprecated in JDK 8 | 移除在 JDK 8 中弃用的 GC 组合
摘要
通过 JEP 173,移除在 JDK 8 中之前废弃的 GC 组合。
非目标
本工作不是为被移除的 GC 组合实现替代方案的目标。大部分剩余的垃圾回收器应该表现得和被移除的 GC 组合一样或更好。本工作的目标不是增强任何垃圾回收器以达到被移除垃圾回收器的性能水平。只有垃圾回收器的调优将作为满足性能目标的一部分进行考虑。
成功度量标准
对于相关的 JVM 选项,不会打印出废弃信息。相反,JVM 将视它们为未知标志。
对于一组合理的基准测试,更改从 ParNew + SerialOld 到 ParallelScavenge + SerialOld 的性能影响是可以理解的。
动机
如 JEP 173 所述,保留所有现有的 GC 组合需要付出巨大的维护成本。移除废弃的 GC 组合将使 HotSpot GC 代码变得更简单,从而减少错误数量,并加快对剩余 GC 组合的开发速度。
描述
将在代码库中删除在 JEP 173 中列为废弃的控制 GC 组合的标志,以及启用 CMS 前台收集器的标志(作为 JDK-8027876 的一部分而被废弃). 这意味着不再为这些标志打印警告信息;如果使用这些标志,JVM 将不会启动。
标志被删除后,任何现在是死代码的代码都将从 GC 代码库中删除。由于此工作可能涉及到大范围的代码简化,因此可能会将这样的简化作为单独的更改进行处理。
以下是将停止工作的标志和标志组合的详细摘要:
DefNew + CMS : -XX:-UseParNewGC -XX:+UseConcMarkSweepGC
ParNew + SerialOld : -XX:+UseParNewGC
ParNew + iCMS : -Xincgc
ParNew + iCMS : -XX:+CMSIncrementalMode -XX:+UseConcMarkSweepGC
DefNew + iCMS : -XX:+CMSIncrementalMode -XX:+UseConcMarkSweepGC -XX:-UseParNewGC
CMS foreground : -XX:+UseCMSCompactAtFullCollection
CMS foreground : -XX:+CMSFullGCsBeforeCompaction
CMS foreground : -XX:+UseCMSCollectionPassing
对于 ParNew + SerialOld 组合,该 JEP 的工作还包括性能测试,比较 ParNew + SerialOld 和 ParallelScavenge + SerialOld。这应该会产生从 ParNew + SerialOld 迁移到 ParallelScavenge + SerialOld 的调优建议。
备选方案
保留在代码中的所有或部分废弃选项。这将阻止 GC 代码中的重大清理工作,并减缓代码库中的新开发进度。
测试
当前的测试用例验证列出的选项是否打印警告信息。这些测试需要更新为期望消息标记为未知的情况。
风险和假设
使用正在被删除的任何标志的用户将不得不更新其 JVM 启动命令行。如果他们从 JDK 8 迁移到 JDK 9,那么他们已经看到过警告消息,因此不应感到惊讶。假设是大多数用户将从将被删除的标志转换到更现代的 GC 调优中受益。
依赖性
这项工作依赖于 JEP 173: Retire Some Rarely-Used GC Combinations。该 JEP 已在 JDK 8 中实施,因此目前没有未解决的依赖关系。