应优先选用OpenJDK发行版(如Eclipse Temurin、Amazon Corretto),仅当需Oracle商业SLA支持时才选Oracle JDK;通过System.getProperty("java.vendor")和"java.vm.name"准确识别厂商,而非依赖java -version。
绝大多数场景直接选 OpenJDK 发行版(如 Eclipse Temurin、Amazon Corretto 或 Microsoft Build),Oracle JDK 仅在明确需要其商业 SLA 支持时才考虑。
别靠 java -version 猜,它常被包装得一模一样。真正可靠的是查 JVM 属性:
System.getProperty("java.vendor")
返回 "Oracle Corporation" 是 Oracle JDK;返回 "Eclipse Adoptium"、"Amazon.com Inc." 或 "Microsoft" 就是对应 OpenJDK 发行版。另外 System.getProperty("java.vm.name") 若含 "OpenJDK" 字样,基本可确认不是 Oracle 官方构建。
java.vm.name 通常是 "Java HotSpot(TM) 64-Bit Server VM"
"OpenJDK"
openjdk:17-jre,但底层其实是 Oracle 构建的二进制(已极少见,2025 年后主流发行版均已自主构建)许可证才是分水岭:OpenJDK 发行版用 GPLv2 + Classpath Exception,允许免费商用、修改、分发;Oracle JDK 的 OTN 协议虽自 JDK 17 起开放了“免费用于生产”,但仅限三年,且不包含法律保障或服务等级承诺(SLA)。
Corretto 提供 LTS 补丁至 2031 年(JDK 17),且补丁同步速度常快于 Oracle 官方JDK 11 后,Java Flight Recorder (JFR) 和 Java Mission Control (JMC) 已全部开源并集成进所有主流 OpenJDK 发行版。你现在用 Temurin 17+ 或 Corretto 21,jcmd 和 jfr dump 全都能跑。
-XX:+FlightRecorder
G1GC 行为在 Oracle JDK 中曾有微调(如 -XX:G1NewSizePercent 默认值不同),但 2025 年主流发行版已对齐;实际压测中,同版本下 GC 停顿差异通常小于 3%libfreetype,导致 PDF 生成乱码)不是代码编译不过,而是运行时静默出错:
javax.crypto 强加密策略:Oracle JDK 8u161+ 默认启用无限强度策略,而部分旧版 OpenJDK 发行版需手动替换 $JAVA_HOME/jre/lib/security/local_policy.jar(JDK 9+ 已取消限制)JNI 库路径:Oracle JDK 的 java.library.path 默认包含 $JAVA_HOME/jre/bin,某些 OpenJDK 构建会省略该路径,导致 UnsatisfiedLinkError
javafx:Oracle JDK 8 自带 JavaFX,但所有 OpenJDK 发行版(包括 Oracle 自己的 JDK 11+)都不再内置;若项目依赖 javafx.scene.control.Button
org.openjfx:javafx-controls Maven 依赖真正卡住人的,从来不是“能不能跑”,而是“为什么在测试环境没问题,上线后某台机器上某个定时任务突然慢了 3 倍”——这种问题往往出在 JVM 参数兼容性或 OS 底层库版本错配,建议灰度发布前,用 jstat -gc 和 jinfo -flags 对比两套环境的实际生效参数。