JEP 214:删除 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 中实现的,因此此时没有遗留任何未完成的依赖项。