JDK 11 升级实践
作者:大淘宝技术 查看原文
推荐语:学习java和jdk的新特性并积极应用,以达到优化系统,降本提效的作用,这是我们作为java研发同学的第一节课。本文从“为什么”起手,谈到“怎么做”,最后用数据证明“怎么样”。细致入微,深入浅出,让我获益匪浅。
——大淘宝技术开发工程师 闻尘
概要
本文以团队内部网关类应用(以下简称应用) 从 JDK 8 升级到 JDK 11 + G1 GC 的实践出发,梳理 JDK 11 升级(踩坑)指南、升级注意事项 以及 Java 9 - 19 的重要新特性:
- 升级收益:介绍应用升级获得的性能提升及成本收益,供大家参考。
- 升级指南:为大家实际动手升级时提供操作指南,避免重复踩坑。升级的主要流程和常见二方、三方依赖的升级 文章里基本都有提到。
- 新特性:简单介绍下 Java 9 - 19 的改进点和新增 API,主要介绍一些个人认为比较有用的新特性,看能否应用到实际开发。
为什么要升级
性能提升
通过运行 SPECJbb2015 对比分析性能, 整体而言 JDK11 优于 JDK8,G1 优于 CMS。 在两个 JDK 版本默认状态下(JDK11 + G1 V.S JDK8 + CMS),JDK11 max-jOPS(纯吞吐量) 分数提升 17% ,critical-jOPS(限制响应时间下的吞吐量) 分数提升 105%。
注:以上数据源自内部测试,非权威数据,仅供参考。
附:本应用升级效果及成本收益
应用升级 JDK 11 + G1 GC 后,单机性能在 极限 QPS、CPU、RT、GC 表现上均有提升,落到成本上可以进一步缩减机器上百台,每年可节省数十万成本。 其中:
- 单机极限 QPS 提升 11% (1.8K -> 2.0K)
- CPU 降低 2 pt (55% -> 53%)
- RT 降低 5% (41ms -> 39ms)
- 日常水位 和 极限 QPS 下,GC 表现均有所提升
YGC 平均次数 和 平均暂停时长均 降低 40-50%
极限 QPS 下 吞吐量提升 4.6pt :93.99% -> 98.65%
持续跟进 Java 新版本
目前,官方已经停止 Java 8 的公共更新。作为 Java 8 后的第一个 LTS,升级 Java 11 不仅能够避免因升级跨度过大带来的稳定性风险(比如 JDK 17 中无法使用 CMS、反射依赖 JDK 内部字段或方法的代码也可能存在不兼容),而且也能降低后续升级 Java 新版本的成本。
升级指南
升级准备
常用的开发软件支持 JDK11 的最低版本:
- IntelliJ IDEA: 2018.2(地址: https://blog.jetbrains.com/idea/2018/06/java-11-in-intellij-idea-2018-2/)
- Eclipse: Photon 4.9RC2 with Java 11 plugin(地址: https://nipafx.dev/)
- Maven: 3.5.0
compiler plugin: 3.8.0
surefire and failsafe: 2.22.0
基础环境升级
-
JDK 升级,可以根据自己应用的部署模式升级
-
Tomcat 升级
依赖升级
依赖检查
在 JDK8 中 JavaSE 和 JavaEE 有很多共享代码,但是 JDK11 中这两部分独立了,JavaEE 相关模块被移除,无法编译,因此需要添加包括这些包的第三方依赖。
如:编译时 @Resource/@PostConstruct等注解找不到,需要显式引入 javax.annotation
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
<version>1.3.2</version>
</dependency>