网站首页 > 文章精选 正文
最近在开发海外需求,需要把之前国内做的一套系统搬到海外业务上,因官网对JDK1.8版本已经不再做维护支持,客户要求需使用JDK17以上版本,因此便把国内基于JDK1.8 + SpringBoot-2.3.3.RELEASE的微服务升级成JDK17 + SpringBoot-2.7.18,本次将详细讲下升级过程中踩的一些坑,以及如何在Mac和Liux上快速安装JDK17等多个版本!
JDK1.8到17做了哪些升级?为何建议全部jdk都升到17?
JDK1.8和JDK17的主要区别
JDK 1.8(2014年发布)与JDK 17(2021年发布,LTS)的主要区别如下:
核心特性更新
- 模块化系统(JDK 9 Jigsaw)
- 本地变量类型推断(JDK 10 var关键字)
- 新版垃圾回收器(ZGC、Shenandoah)
- 文本块(JDK 13)、Switch表达式模式匹配
- Record类(JDK 16)、密封类(JDK 17)
性能提升
- 毫秒级的低延迟GC(ZGC性能优化),据美团开发说,在Zeus服务不同集群中,ZGC在低延迟场景见效非常可观(TP99下降了5
28ms,下降幅度10%47%) - 向量API(JDK 16孵化)
- 更高效的容器感知(容器环境资源管理)
生态支持
- 官方长期支持(JDK 17 LTS支持至2029年)
- 商业许可变更(Oracle JDK vs OpenJDK)
升级JDK17推荐版本选择
- 生产环境优先推荐 JDK 17 LTS(官方支持至2029年),LTS版本是指那些提供长期技术支持和维护的Java开发工具包
- 若需保持旧生态兼容性,可暂用JDK 11 LTS
升级到JDK17后的JVM参数GC配置
使用ZGC的JVM参考配置
--add-opens=java.base/java.lang=ALL-UNNAMED \-Xms1500m -Xmx1500m \-XX:ReservedCodeCacheSize=256m \-XX:InitialCodeCacheSize=256m \ -XX:+UnlockExperimentalVMOptions \-XX:+UseZGC \-XX:ConcGCThreads=1 -XX:ParallelGCThreads=2 \-XX:ZCollectionInterval=30 -XX:ZAllocationSpikeTolerance=5 \-XX:+UnlockDiagnosticVMOptions -XX:-ZProactive \-Xlog:safepoint,classhisto*=trace,age*,gc*=info:file=/opt/gc-%t.log:time,tid,tags:filecount=5,filesize=50m \-XX:+HeapDumpOnOutOfMemoryError \-XX:HeapDumpPath=/opt/errorDump.hprof
jvm参数解释
官方参考文档
- Spring Boot 3.0 Release Notes:https://spring.io/blog/2022/11/24/spring-boot-3-0-goes-ga
- Oracle JDK支持路线图:https://www.oracle.com/java/technologies/java-se-support-roadmap.html
安装多版本JDK
由于本地服务器有多个应用在部署,所以需要安装多个jdk的版本,这里我将详细讲下mac和linux如何安装多版本jdk
Mac安装多版本JDK步骤
在 macOS 上管理多版本 JDK 可通过以下步骤实现(推荐使用 jenv + Homebrew 方案):
一、安装 JDK 17
1. Homebrew命令安装-国内用户安装会比较慢
# 安装 Eclipse Temurin JDK(推荐长期支持版)
brew tap homebrew/cask-versions
brew install --cask temurin@17
# 验证安装路径(默认路径)
/Library/Java/JavaVirtualMachines/temurin-17.jdk/Contents/Home
博主试了下,国内使用这个命令装会一直卡着不动,建议缓存手动安装
2. 或手动下载安装
- 官网下载 JDK 17.dmg:https://www.oracle.com/java/technologies/downloads/#java17 下载安装包
- 安装后路径通常为:/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home
下载完成后,直接点击dmg文件,再一直傻瓜式操作点击下一步,即可安装完成,安装完成界面如下
安装完成后可以看到
/Library/Java/JavaVirtualMachines/jdk/目录下多了个17的文件夹
二、安装jdk版本管理工具 jenv
# 安装 jenv
brew install jenv
# 配置 Shell(根据你的 Shell 类型选择)
echo 'export PATH="$HOME/.jenv/bin:$PATH"' >> ~/.zshrc
echo 'eval "$(jenv init -)"' >> ~/.zshrc
source ~/.zshrc
三、添加 JDK 到 jenv
把jdk的全路径配置到jenv,
# 添加已安装的 JDK
jenv add /Library/Java/JavaVirtualMachines/jdk1.8.0_xxx.jdk/Contents/Home # 替换为你的 JDK8 路径
jenv add /Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home
# 查看已注册版本
jenv versions
四、快速切换版本
场景 | 命令 |
全局默认版本 | jenv global 17 (或 1.8) |
当前终端临时切换 | jenv shell 17 |
按目录设置版本 | jenv local 1.8 |
五、验证版本切换
# 检查 Java 版本
java -version
# 检查编译器版本
javac -version
# 查看 JAVA_HOME 路径
jenv javahome
输入命令可以看到全部版本均切换到了jdk17
六、环境变量配置(可选)
若需直接使用 JAVA_HOME 变量:
# 在 ~/.zshrc 或 ~/.bash_profile 中添加
export JAVA_HOME=$(jenv javahome)
七、IDE 配置建议
- IntelliJ IDEA:
Preferences → Build → Build Tools → Gradle → Gradle JVM 选择对应版本 - VSCode:
安装 Java Extension Pack,通过 Command Palette → Java: Configure Java Runtime 设置
注意事项
- PATH 优先级:确保 jenv shims 路径优先级高于系统默认 Java
- Maven/Gradle:建议在项目级配置中指定 JDK 版本(如 pom.xml 或 gradle.properties)
- 手动安装 JDK:Oracle JDK 与 OpenJDK 路径可能不同,需准确添加至 jenv
通过此方案,你可以无缝切换 JDK 1.8 和 17,满足不同项目的编译需求。
Linux安装JDK步骤
linux安装jdk直接使用命令安装openjdk即可完成,具体安装步骤参考我之前的文章:
https://mpbeta.csdn.net/mp_blog/creation/editor/145764470
三、SpringBoot版本升级
spring cloud和spring boot版本升级
升级了jdk后原来的低版本springboot就不可用了,由于Spring Cloud依赖于Spring Boot,用了Spring Cloud的也需要进行升级,他们之间映射支持版本关系如下:
这里我使用的是2.7.18版本
Maven构建工具版本升级
总结
本文详细讲解了如何安装jdk17版本,以及升级完成jdk17后,如何修改对应的SpringBoot相关依赖版本。如果你的微服务还是经常出现FullGC,频繁卡顿情况,可以进行JDK版本升级再修改JVM的ZGC配置,说不定一切问题都迎刃而解了!
猜你喜欢
- 2025-06-13 SpringBoot权限炸场!动态鉴权提速10倍吊打RBAC(附工具源码)
- 2025-06-13 Spring Boot 3.4 新特性实战解析(springboot最新)
- 2025-06-13 SpringBoot 2.7.10、3.0.5 发布,修复 DoS漏洞
- 2025-06-13 springboot(二十八)stomp在spring5.3以上报跨域问题的处理
- 2025-06-13 还在为 Spring Boot3 动态配置发愁?一文教你轻松搞定!
- 2025-06-13 SpringBoot几种动态修改配置的方法
- 2025-06-13 快来看看SpringBoot2.2发行版,你能用到哪些新特性?
- 2025-06-13 Spring Boot3 应用打包成 Docker 镜像全攻略
- 2025-06-13 Spring Boot3 动态配置实现方案全解析,你掌握了吗?
- 2025-06-13 Spring Framework 6.2 和 Spring Boot 3.4 为 2025 年新一代做好准备
- 最近发表
- 标签列表
-
- newcoder (56)
- 字符串的长度是指 (45)
- drawcontours()参数说明 (60)
- unsignedshortint (59)
- postman并发请求 (47)
- python列表删除 (50)
- 左程云什么水平 (56)
- 计算机网络的拓扑结构是指() (45)
- 编程题 (64)
- postgresql默认端口 (66)
- 数据库的概念模型独立于 (48)
- 产生系统死锁的原因可能是由于 (51)
- 数据库中只存放视图的 (62)
- 在vi中退出不保存的命令是 (53)
- 哪个命令可以将普通用户转换成超级用户 (49)
- noscript标签的作用 (48)
- 联合利华网申 (49)
- swagger和postman (46)
- 结构化程序设计主要强调 (53)
- 172.1 (57)
- apipostwebsocket (47)
- 唯品会后台 (61)
- 简历助手 (56)
- offshow (61)
- mysql数据库面试题 (57)