JDK11 升级 JDK17 最全实践干货来了

1、前言 
上篇文章给大家带来了 JDK8 升级 JDK11 的最全实践 , 相信大家阅读后已经对 JDK11 有了比较深入的了解 。2021 年 9 月 14 日 , Oracle 发布了可以长期支持的 JDK17 版本,那么从 JDK11 到 JDK17 , 到底带来了哪些特性呢?亚毫秒级的 ZGC 效果到底怎么样呢?值得我们升级吗?而且升级过程会遇到哪些问题呢?带着这些问题,本篇文章将带来完整的 JDK11 升级 JDK17 最全实践 。
2、为什么升级 JDK171)长期支持版本
JDK17 是 Oracle 官方在 2021 年 9 月 14 日发布的一个长期支持(LTS)版本 , 意味着它将获得长期的更新和支持 , 有助于保持程序的稳定性和可靠性 。
2)性能提升
更好的垃圾回收器 。综合评估,从 JAVA 8 升级到 Java 11,**G1GC 平均速度提升 16.1%,ParallelGC 为 4.5%****,** 从 Java 11 升级到 Java 17 , G1GC 平均速度提升 8.66%,ParallelGC 为 6.54%(基于 OptaPlanner 的用例基准测试表明)
最大的亮点是带来了稳定版的 ZGC 垃圾回收器,达到亚毫秒级停顿 。
3)新语法和特性
Switch 表达式简化、Text Blocks 文本块、instanceof 的模式匹配升级和 NullPointerException 提示信息改进等
4)支持最新的技术和框架
Spring framework6 和 Spring Boot3 都默认使用 Java 17 作为最低版本
3、升级后压测效果

先给出结论:
1、JDK17 相对于 JDK8 和 JDK11, 所有垃圾回收器的性能都有很明显的提升 , 特别是稳定版的 ZGC 垃圾回收器
2、 不论任何机器配置下,都推荐使用 ZGC,ZGC 的停顿时间达到亚毫秒级,吞吐量也比较高
我在 JDOS 平台上选择了不同配置的机器(2C4G、4C8G、8C16G),并分别使用 JDK8、JDK11 和 JDK17 进行部署和压测 。
整个压测过程限时 60 分钟,用 180 个虚拟用户并发请求一个接口,每次接口请求都创建 512Kb 的数据 。最终产出不同 GC 回收器的各项指标数据 , 来分析 GC 的性能提升效果 。
以下是压测的性能情况:
JDK11 升级 JDK17 最全实践干货来了

文章插图
4、OracleJDK 和 OpenJDK 的选择2021 年 9 月 , Oracle 宣布 JDK17 可以免费商用 , 直到下一个 LTS 版本之后继续提供整整一年,同时 Oracle 将继续按照自 Java 9 以来的相同版本和时间表提供 GPL 下的 Oracle OpenJDK 版本 。
2023 年 9 月,OracleJDK 发布了新的 LTS 版本 JDK21,这就意味着从 2024 年 9 月开始,在生产环境使用 OracleJDK17 将需要付费 。
JDK11 升级 JDK17 最全实践干货来了

文章插图
参考: https://www.oracle.com/hk/java/technologies/downloads/#java17
OracleJDK 和 OpenJDK 这两个之间没有真正的技术差别,因为针对 Oracle JDK 构建过程是基于 OpenJDK 的 。自从 JDK11 开始,OracleJDK 和 OpenJDK 在功能上基本相同,所以推荐使用 OpenJDK17 或其他开源的 JDK 版本,这些开源版本都是基于 OpenJDK 构建并提供长期支持的,比如:AdoptOpenJDK、RedHatOpenJDK 。
JDK11 升级 JDK17 最全实践干货来了

文章插图
官方参考: https://blogs.oracle.com/java/post/oracle-jdk-releases-for-java-11-and-later
5、JDK11 到 JDK17 带来了哪些新特性5.1、JVM 改进
1、ZGC 垃圾回收器从实验性功能更改为正式产品功能,从 JDK11 引入以来,经过持续的迭代升级 , 目前已经足够稳定 。需要手动开启,开启方式:-XX:+UseZGC
2、G1 垃圾回收器仍然作为默认垃圾回收器 , 进行改进升级,主要包括可中止的混合收集集合、NUMA 可识别内存分配等
3、JDK14 开始删除 CMS 垃圾回收器
4、JDK14 开始弃用 ParallelScavenge 和 SerialOld GC 的组合使用
5、JDK15 禁用偏向锁 , 默认禁用:-XX:+UseBiasedLocking
6、NullPointerException 提示信息改进
JDK14 以前的出现 NullPointerException 时,只能定位到所在异常行,无法定位具体是哪个变量 。改进后的 NullPointerException,可以清晰描述具体变量,提升了空指针异常的可读性 。
JDK11 升级 JDK17 最全实践干货来了

文章插图
5.2、新语法特性
5.2.1、Switch 表达式简化
switch 表达式带来了简化式的编码方式,提供了新的分支切换方式,即 -> 符号,右则表达式方法体在执行完分支方法之后,自动结束 switch 分支,同时 -> 右则方法块中可以是表达式、代码块或者是手动抛出的异常
参考: https://openjdk.org/jeps/361


推荐阅读