Java 虚拟机

背景 日常说的「JVM」常混用两层含义: JVM 规范(JLS/JVMS):字节码、class 文件格式、类加载语义、JNI、JPDA 等,与具体实现无关。 JVM 实现:真正把字节码跑起来的运行时,如 HotSpot、OpenJ9。 安装 java 命令得到的是 JDK 发行版(见 OpenJDK JDK 发行版;安装命令见 openjdk),其中默认捆绑的虚拟机实现几乎都是 HotSpot。本文介绍 JVM 实现(HotSpot、OpenJ9、GraalVM Native 等)的差异与选型;HotSpot 的参数与工具见 hotspot。 JDK 发行版 vs JVM 实现 Temurin、Corretto、Dragonwell 等是不同厂商打包的 OpenJDK 发行版,默认都跑 HotSpot,不是三种并列的 JVM。换 Temurin 换 Corretto,通常只是换构建源与支持方;要换虚拟机实现才看 OpenJ9(Semeru)或 GraalVM Native Image。发行版对照见 openjdk-distributions.md。 规范层:各实现共同遵守什么 无论用哪种 JVM,下列概念在规范层是共通的: 概念 说明 字节码 javac 产出 .class,由虚拟机解释或 JIT 编译后执行 类加载 加载、链接、初始化;双亲委托等模型见 classloader JNI Java 与本地代码互操作规范,见 java-jni JPDA 调试体系(JDI / JDWP / JVMTI),见 java-debug-JPDA 规范 不 规定用哪种垃圾收集器、有哪些 -XX 开关、是否提供 JFR——这些是实现细节。 主流 JVM 实现对照 实现 典型发行版 特点 适用场景 HotSpot Oracle JDK、Temurin、Corretto、Dragonwell 等 生态最全;C1/C2 JIT、G1/ZGC/Shenandoah、JFR、jcmd、Attach 默认可用 默认首选;绝大多数服务端与桌面应用 Eclipse OpenJ9 IBM Semeru 常更低内存占用、较快启动;工具链与 HotSpot 不同 容器密度高、内存敏感;需验证 agent/诊断工具兼容性 GraalVM GraalVM CE/EE 可嵌 HotSpot 作 JIT 运行时,或通过 Native Image AOT 为本地可执行文件 极致冷启动(serverless、CLI);见 GraalVM 简介、Native Image JRockit 已停止独立发展 曾用于金融低延迟;特性已并入 HotSpot 仅作历史了解,见 jrockit ┌─────────────────────────────────┐ │ Java 语言 + JVM 规范 │ └─────────────────────────────────┘ │ ┌───────────────────────────┼───────────────────────────┐ ▼ ▼ ▼ OpenJDK HotSpot Eclipse OpenJ9 GraalVM (默认 java 命令) (Semeru 等) ┌──────┴──────┐ │ │ ▼ ▼ │ │ HotSpot 运行时 Native Image ▼ ▼ (JIT) (AOT 本地二进制) jcmd / JFR / Attach 自有诊断工具 选型建议 没有明确理由时,用 HotSpot(即常见 OpenJDK 发行版)。文档、agent、APM、排障经验都围绕它积累最多。 内存或启动是瓶颈,且已验证依赖(Attach、部分 agent、GC 日志格式)在目标环境可用,可评估 OpenJ9。 冷启动极敏感(函数计算、短生命周期进程),评估 GraalVM Native Image(见 GraalVM 简介、Native Image);需接受构建期分析、反射配置、动态类加载受限等成本。 不要混用概念:GraalVM 不等于「又一个 HotSpot」;Native Image 路径下没有传统 JIT 预热,也没有完整的 -XX 调优空间。 HotSpot 执行路径(概念) HotSpot 的典型路径(细节见专文): ...

Created 19196-05-19 · Updated 15156-07-15 · 2 min · 308 words · -

Spring AOT

是什么 Spring AOT(Ahead-Of-Time)是 Spring Framework 6 / Spring Boot 3 引入的构建期处理机制:在打包或 Native 编译之前,对 Spring ApplicationContext 做静态分析,生成预先计算好的 bean 定义、反射/资源 hint,以及(可选)面向 GraalVM Native Image 的入口代码。 默认 Spring Boot 应用在运行时做 classpath 扫描、@Configuration 解析、条件装配(@Conditional / @ConditionalOn*)和大量反射;Spring AOT 把这些工作尽量前移到构建期,使: 在 HotSpot JVM 上跑的处理后 JAR,启动更快(仍用 java -jar) 在 GraalVM Native Image 路径上,构建器能拿到闭世界分析所需的元数据 不要和 JDK AOT 混淆 博客与 JDK 发行说明里还有另一类「AOT」,含义不同: 名称 层级 做什么 Spring AOT Spring 框架 / Boot 插件 构建期处理 IoC 容器,生成 bean 与 Native hint GraalVM Native Image AOT GraalVM 工具链 字节码 → 本地机器码 + Substrate VM JDK AOT 缓存(JEP 483 等) HotSpot JVM 训练运行后缓存类加载/链接/剖析,缩短下次 JVM 冷启动 Spring AOT 常与 GraalVM Native Image 配合使用,但不是同一 thing;JDK 24+ 的 AOT 缓存与 Spring AOT 可以并存,也互不替代。JDK 侧见 JDK 25 变更汇总、JVM 编译器。 ...

Created 21216-06-21 · Updated 15156-07-15 · 3 min · 596 words · -

GraalVM Native Image 简介

是什么 GraalVM Native Image 是 GraalVM 提供的 AOT(Ahead-Of-Time) 编译路径:在构建期把 Java 应用及其依赖静态分析,编译成本地可执行文件(Linux/macOS/Windows 上的单一二进制或小型目录),运行时不再依赖传统意义上的 java -jar + 完整 JRE/HotSpot 进程模型。 与日常默认的 HotSpot 路径对比: HotSpot: 源码 → javac → .class → java 启动 JVM → 解释/JIT → 运行 Native Image: 源码 → javac → .class → native-image 构建 → 本地二进制 → 直接运行 GraalVM 平台总览见 GraalVM 简介。作为运行时有两种常见用法,不要混为一谈: 作为 HotSpot 上的高性能 JIT 编译器(仍是 java 命令跑字节码) 作为 Native Image 工具链(产出独立可执行文件,本文主题) 为什么用它 维度 HotSpot + JAR Native Image 冷启动 秒级常见(JVM 启动、类加载、Spring 扫描) 毫秒级常见 内存占用 完整 JVM 堆与元空间 无 HotSpot 堆模型;通常更小 镜像/分发 需 JRE 或容器内 Java 运行时 单一二进制 + 可选少量资源文件 峰值吞吐 JIT 预热后通常更强 无 C2 长时间优化,长时间 CPU 密集型可能不如 HotSpot 构建 mvn package 较快 native-image 构建慢,CI 时间显著增加 典型场景:Serverless/函数计算、CLI 工具、Kubernetes 中短生命周期且副本多的 Pod、对启动延迟敏感的边缘服务。 ...

Created 21216-06-21 · Updated 27276-06-27 · 4 min · 667 words · -

GraalVM

是什么 GraalVM 是 Oracle 主导的 高性能 JDK 发行版与工具链,基于 OpenJDK,但不止「又一个 Temurin」:它在同一产品里组合了 Java 运行时、Graal JIT 编译器、Native Image AOT、Truffle 多语言运行时 等能力。 日常讨论里常把 GraalVM 缩略成「Native Image 用的那个 JDK」,实际上 Native Image 只是其组件之一;完整图景见下文与 Java 虚拟机 生态对照。 发行版 版本 说明 Community Edition (CE) 开源(GPLv2 + Classpath exception),GitHub 发布 Enterprise Edition (EE) 商业支持,额外性能与工具(需 Oracle 许可) 安装后通常提供 java、javac、native-image、gu(GraalVM Updater,用于安装/管理组件)等命令。具体组件集因版本与安装方式而异。 三种常见使用方式 GraalVM 发行版 │ ┌─────────────────────┼─────────────────────┐ ▼ ▼ ▼ JVM 模式(java) Native Image Truffle / Polyglot HotSpot + Graal JIT AOT 本地二进制 JS/Python/Ruby 等同 JVM 上互操作 │ │ │ └── 见专文 └── 仍跑 .class,可替代默认 C2 路径(视版本与 -XX 开关) 1. JVM 模式:Graal 作 JIT 用 GraalVM 自带的 java 跑字节码,底层仍是 HotSpot VM,但可用 Graal 编译器 作为 JIT 替代或补充传统 C1/C2(取决于 JDK 版本与 JVM 参数;OpenJDK 曾实验性集成 Graal JIT,JDK 17+ 默认路径以 C2 为主,Graal JIT 需显式启用或视发行版而定)。 ...

Created 21216-06-21 · Updated 21216-06-21 · 2 min · 341 words · -