升级JDK 11
选择JDK 11,是因为在JDK 11中首次支持ZGC,而且JDK 11属于长期支持(Long Term Support,LTS)版本,至少会被维护三年,普通版本(如JDK 12、JDK 13和JDK 14)只有6个月的维护周期,不建议使用 。
【美团对 Java 新一代垃圾回收器 ZGC 的探索与实践】本地测试环境安装
从两个源OpenJDK和OracleJDK下载JDK 11,二个版本的JDK主要区别是长时期的免费和付费,短期内都免费 。注意JDK 11版本中的ZGC不支持mac OS系统,在Mac OS系统上使用JDK 11只能用其他垃圾回收器,如G1 。
生产环境安装
升级JDK 11不仅仅是升级自己项目的JDK版本,还需要编译、发布部署、运行、监控、性能内存分析工具等项目支持 。美团内部的实践:
编译打包:美团发布系统支持选择JDK 11进行编译打包 。
线上运行 & 全量部署:要求线上机器已安装JDK 11,有3种方式:
- 新申请默认安装JDK 11的虚拟机:试用JDK 11时可用这种方式;全量部署时,如果新申请机器数量过多,可能没有足够机器资源 。
- 通过手写脚本给存量虚拟机安装JDK 11:不推荐,业务同学过多参与到运维当中 。
- 使用容器提供的镜像部署功能,在打包镜像时安装JDK 11:推荐方式,不需要新申请资源 。
性能内存分析:线上遇到性能问题时,还需要借助Profiling工具,美团的性能诊断优化平台Scalpel已支持JDK 11的性能内存分析 。如果你的公司没有相关工具,推荐使用JProfier 。
解决组件兼容性
我们的项目包含二十多万行代码,需要从JDK 7升级到JDK 11,依赖组件众多 。虽然看起来升级会比较复杂,但实际只花了两天时间即解决了兼容性问题 。具体过程如下:
1. 编译,需要修改pom文件中的build配置,根据报错作修改,主要有两类:
a. 一些类被删除:比如“sun.misc.BASE64Encoder”,找到替换类java.util.Base64即可 。
b. 组件依赖版本不兼容JDK 11问题:找到对应依赖组件,搜索最新版本,一般都支持JDK 11 。
2. 编译成功后,启动运行,此时仍有可能组件依赖版本问题,按照编译时的方式处理即可 。
升级所修改的依赖:
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.4</version>
</dependency>
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator-parent</artifactId>
<version>6.0.16.Final</version>
</dependency>
<dependency>
<groupId>com.sankuai.inf</groupId>
<artifactId>patriot-sdk</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>org.Apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.9</version>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
</dependency>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.1.39.Final</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
JDK 11已经出来两年,常见的依赖组件都有兼容性版本 。但是,如果是公司内部提供的公司级组件,可能会不兼容JDK 11,需要推动相关组件进行升级 。如果对方升级较为困难,可以考虑拆分功能,将依赖这些组件的功能单独部署,继续使用低版本JDK 。随着JDK 11的卓越性能被大家悉知,相信会有更多团队会用JDK 11解决GC问题,使用者越多,各个组件升级的动力也会越大 。验证功能正确性
推荐阅读
- java中的装箱和拆箱
- 2019年的6个JavaScript用户认证库
- 方便面与挂面哪个更健康?
- 又一个小而美的Java Web框架:Solon
- 音频技术解析:纯理论对比PCM和DSD
- 万字详文:Java内存泄漏、性能优化、宕机死锁的N种姿势
- 黄魁与黄金芽的对比,太平猴魁的选购方法
- 对讲机电池原理和使用注意事项
- 毒士是贾诩还是李儒
- 经常喝茶的好处有哪些,佩戴粉晶对人体有哪些好处