生产环境应选用OpenJDK 21 LTS(支持至2026年),从Adoptium或BellSoft官网下载msi安装包,架构与系统一致,安装路径无空格中文,正确配置系统级JAVA_HOME和Path,并确保运行JDK版本不低于编译版本,启用G1GC及固定堆内存与GC日志。

怎么选JDK版本和安装包
生产环境别碰Oracle JDK 8免费版,它早就不更新了,连安全补丁都停了。OpenJDK是唯一靠谱选择,推荐使用LTS版本:jdk-17 或 jdk-21,优先选jdk-21(2023年9月发布,LTS支持到2026年)。下载必须认准官方渠道:<a href="https://www.php.cn/link/e387385ebe0dbeefed3e8e9f3968aaba">https://www.php.cn/link/e387385ebe0dbeefed3e8e9f3968aaba</a>(Eclipse Temurin)或 <a href="https://www.php.cn/link/33c54daf901630e4e088b9986156a597">https://www.php.cn/link/33c54daf901630e4e088b9986156a597</a>(Liberica),别用第三方打包的“精简版”——它们常删掉jmods、javac甚至jstack,出问题时连线程堆栈都抓不到。
- 安装包选
msi格式,不是zip:自动注册系统变量、关联文件类型、写入Windows事件日志,运维排查有依据 - 架构必须和服务器一致:x64服务器上装
jdk-21_x64.msi,别混用ARM64或32位包,否则java -version能跑,但Spring Boot启动直接报UnsatisfiedLinkError - 安装路径避免空格和中文:
C:\Java\jdk-21.0.2可以,C:\Program Files\Java...不行——某些老脚本会把空格当参数分隔符,导致JAVA_HOME解析失败
JAVA_HOME 和 Path 怎么设才不翻车
Windows服务、IIS反向代理、甚至Tomcat Windows Service Installer,全依赖JAVA_HOME环境变量。只设Path不设JAVA_HOME,多数中间件启动就失败。
-
JAVA_HOME必须指向JDK根目录,不是bin子目录:C:\Java\jdk-21.0.2✔️,C:\Java\jdk-21.0.2\bin❌ -
Path里只加%JAVA_HOME%\bin,别重复写死绝对路径,否则升级JDK后要改两处 - 所有变量用系统级环境变量,不是当前用户级——Windows服务默认以
LocalSystem或专用账户运行,读不到用户变量 - 设完重启命令行窗口,用
echo %JAVA_HOME%和where java双重验证:前者输出路径,后者返回%JAVA_HOME%\bin\java.exe才对
为什么 Tomcat / Spring Boot 启动报 “Unsupported class file major version”
这错误90%是JDK编译版本和运行版本不匹配。比如用jdk-21编译的WAR包,扔进只装了jdk-11的服务器,必然崩。
- 查看应用编译目标版本:
javap -v YourApplication.class | findstr "major",结果是65 → 对应JDK 21,61 → JDK 17 - 运行环境JDK版本 ≥ 编译版本,但不能低:JDK 17运行JDK 21编译的字节码?不行。反过来可以(JDK 21运行JDK 17编译的包),但不建议——可能触发
IllegalAccessError(模块访问规则变严) - Maven项目检查
pom.xml里的maven-compiler-plugin:<source>21</source>和<target>21</target>必须和服务器JDK一致 - Spring Boot应用还要看
spring-boot-starter-parent版本兼容性:2.7.x最高只支持JDK 17,3.2.x才正式支持JDK 21
GC 日志和内存参数怎么配才稳
生产环境不配GC参数=裸奔。默认UseParallelGC在多核服务器上容易抢CPU,而G1GC没调优又常因大对象触发Full GC。
立即学习“Java免费学习笔记(深入)”;
- 强制指定GC算法:
-XX:+UseG1GC(JDK 9+默认,但显式写上更明确) - 内存参数必须成对出现:
-Xms4g -Xmx4g,禁止-Xms2g -Xmx8g——Windows下JVM申请虚拟内存后不释放,堆扩缩反而引发卡顿 - 开启GC日志(JDK 11+):
-Xlog:gc*:file=C:/logs/gc.log:time,tags,level,路径必须提前建好C:\logs目录并赋权给运行账户 - 禁用
-XX:+UseStringDeduplication(除非确认应用大量重复字符串)——它增加GC停顿时间,且只对G1有效,ZGC/Shenandoah不支持
JDK配置最麻烦的不是装不上,而是装上了但被另一套旧环境变量覆盖,或者服务账户根本读不到JAVA_HOME。上线前一定用服务账户手动执行一次java -version,别只在管理员CMD里测。










