OpenJDK是JDK发行版,不直接提供JVM实现;HotSpot、OpenJ9等才是遵循JVM规范的具体实现,OpenJDK默认捆绑HotSpot但支持替换为其他合规VM。

JVM规范是接口,OpenJDK的JVM是具体实现之一。它不等于“OpenJDK实现了JVM规范”,而是:OpenJDK项目默认捆绑了HotSpot VM(或其他可选VM),而HotSpot VM才是那个真正遵循JVM规范的实现体。
为什么说 OpenJDK 本身不提供 JVM 实现?
OpenJDK 是一个开源的 JDK 项目,包含编译器(javac)、类库(rt.jar 或 java.base 模块)、工具(jstack、jmap)和——通常默认的——HotSpot 虚拟机。但 OpenJDK 的构建系统允许你替换底层 VM,比如用 OpenJ9 编译进同一个 JDK 目录结构里,照样能跑 java -version。
这意味着:
- OpenJDK 是一个“发行版”(distribution),不是 VM 实现本身
- JVM 规范(如《Java Virtual Machine Specification》)定义的是字节码格式、运行时数据区、指令语义、异常处理等抽象契约
- HotSpot、OpenJ9、GraalVM 等才是满足该契约的具体实现,它们各自决定:
ClassLoader怎么加载、MethodArea存在哪、GC用什么算法、Just-In-Time编译器怎么优化热点方法
HotSpot 在 OpenJDK 中的默认地位是怎么来的?
从 OpenJDK 7 开始,Oracle 将 HotSpot 源码贡献进 OpenJDK 项目,并作为其参考实现。此后绝大多数 OpenJDK 发行版(如 Adoptium Temurin、Amazon Corretto、Red Hat Build of OpenJDK)都默认采用 HotSpot,但这是工程选择,不是规范强制。
关键事实:
-
java -version输出里带 “HotSpot” 字样,说明你当前用的是 HotSpot 实现,不是 OpenJDK “自己写的 VM” - 你可以用
--enable-preview启用 GraalVM 的native-image,或在构建 OpenJDK 时指定--with-jvm-variants=server,zero来启用非 HotSpot 变体(虽然 Zero 已废弃) - IBM 的 OpenJ9 不属于 OpenJDK 代码库,但它能与 OpenJDK 类库完全兼容,因为它严格实现了同一份 JVM 规范
常见混淆点:OracleJDK vs OpenJDK vs HotSpot
三者不是并列关系,而是嵌套+耦合关系:
-
HotSpot是 JVM 实现(由 Oracle 开发,开源进 OpenJDK) -
OpenJDK是 JDK 发行版,含 HotSpot + 类库 + 工具,按 GPL v2 许可发布 -
OracleJDK是 Oracle 提供的商业 JDK 发行版,从 JDK 11 起代码基线与 OpenJDK 几乎一致,区别主要在支持周期、JFR(Java Flight Recorder)默认开启状态、以及某些闭源工具(如JMC)的可用性
所以当你执行 java -XX:+PrintCommandLineFlags,看到的其实是 HotSpot 的参数解析逻辑;而 javac 编译出的 .class 文件,只要符合 ClassFile 格式规范,任何合规 JVM(哪怕是你自己写的)都能加载——这才是 JVM 规范真正的价值所在。
真正容易被忽略的是:规范只管“能不能跑”,不管“跑多快”或“内存怎么布局”。比如 G1GC 和 ZGC 都满足 GC 规范,但前者有停顿,后者宣称低延迟;HotSpot 把 String 存在堆里,GraalVM Native Image 却可能把它固化进镜像——这些差异全在实现层,规范里一句都没提。











