主流 JVM 实现详解
本文详细介绍截止 2025 年的主流 JVM 实现、特性对比及选型建议。
一、JVM 概述
JVM(Java Virtual Machine)是 Java 程序的运行基础,负责将 Java 字节码转换为机器码执行。不同厂商的 JVM 实现各有特点,选择合适的 JVM 对应用性能至关重要。
主流 JVM 分类:
JVM 实现
│
┌──────────────────┼──────────────────┐
│ │ │
Oracle 系 IBM/Eclipse 系 其他厂商
│ │ │
┌────┴────┐ │ ┌──────┴──────┐
│ │ │ │ │
HotSpot GraalVM OpenJ9 Azul Zing 其他发行版
二、主流 JVM 实现
2.1 Oracle HotSpot JVM
地位:市场占有率最高的 JVM,是 OpenJDK 的默认实现,绝大多数 Java 应用运行其上。
发展历程
| 时间 | 事件 |
| 1999 | Sun Microsystems 发布 HotSpot |
| 2006 | Sun 开源 Java,成立 OpenJDK |
| 2010 | Oracle 收购 Sun,获得 HotSpot 和 JRockit |
| JDK 8 | 完成 HotSpot 与 JRockit 整合(Mission Control 等) |
| JDK 9 | G1 成为默认 GC |
| JDK 11 | 引入 ZGC(实验性) |
| JDK 12 | 加入 Shenandoah GC |
| JDK 15 | ZGC 正式可用 |
| JDK 21 | 虚拟线程正式发布 |
核心架构
┌─────────────────────────────────────────────────────────────┐
│ HotSpot JVM │
├─────────────────────────────────────────────────────────────┤
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐ │
│ │ 类加载子系统 │ │ 执行引擎 │ │ 运行时数据区 │ │
│ │ │ │ │ │ │ │
│ │ • Bootstrap │ │ • 解释器 │ │ • 方法区/元空间 │ │
│ │ • Extension │ │ • C1 编译器 │ │ • 堆 │ │
│ │ • App │ │ • C2 编译器 │ │ • 栈 │ │
│ │ │ │ • 分层编译 │ │ • 程序计数器 │ │
│ └─────────────┘ └─────────────┘ │ • 本地方法栈 │ │
│ └─────────────────────┘ │
├─────────────────────────────────────────────────────────────┤
│ 垃圾收集器 │
│ Serial │ Parallel │ CMS │ G1 │ ZGC │ Shenandoah │
└─────────────────────────────────────────────────────────────┘
JIT 编译器
| 编译器 | 特点 | 优化级别 |
| C1 (Client) | 编译快,优化少 | Level 1-3 |
| C2 (Server) | 编译慢,深度优化 | Level 4 |
| 分层编译 | C1 + C2 协作,兼顾启动和峰值性能 | 默认启用 |
垃圾收集器
| GC | 引入版本 | 特点 | 适用场景 |
| Serial | JDK 1.3 | 单线程,STW | 小内存、客户端 |
| Parallel | JDK 1.4 | 多线程,高吞吐 | 批处理、后台任务 |
| CMS | JDK 1.4 | 并发标记清除,低停顿 | 已废弃(JDK 14) |
| G1 | JDK 7 | 分区收集,可预测停顿 | 通用场景(默认) |
| ZGC | JDK 11 | 超低延迟(<1ms),TB级堆 | 大内存、延迟敏感 |
| Shenandoah | JDK 12 | 并发压缩,低延迟 | 中大堆、延迟敏感 |
性能特点
优势 ✅ 劣势 ❌
─────────────────────────────────────────────────────
• 吞吐量最高 • 内存占用相对较高
• 延迟可控(ZGC/Shenandoah) • 冷启动时间较长
• GC 选择丰富 • 预热时间较长
• 生态成熟,文档丰富
• 调优工具完善(JFR、JMC)
• 社区活跃,更新频繁
2.2 GraalVM
地位:Oracle 开发的高性能多语言 JVM,被称为"下一代 JVM"。
架构图
┌─────────────────────────────────────────────────────────┐
│ GraalVM │
├─────────────────────────────────────────────────────────┤
│ Graal JIT Compiler │ Native Image (AOT) │
├─────────────────────────────────────────────────────────┤
│ Truffle Framework(多语言支持) │
├─────────────────────────────────────────────────────────┤
│ Java │ JavaScript │ Python │ Ruby │ R │ ... │
└─────────────────────────────────────────────────────────┘
两种运行模式
(1) JIT 模式(Graal Compiler)
| 特性 | 说明 |
| 定位 | HotSpot C2 编译器的替代品 |
| 实现语言 | Java(更易维护和扩展) |
| 优化技术 | 激进内联、逃逸分析、部分逃逸分析 |
| 优势 | 某些场景性能超越 C2 |
(2) AOT 模式(Native Image)
将 Java 应用编译为独立的原生可执行文件。
Java 源码/字节码
│
▼ (native-image 工具)
┌─────────────────────────────┐
│ 静态分析 + 提前编译 │
│ • 可达性分析 │
│ • 初始化代码执行 │
│ • 生成机器码 │
└─────────────────────────────┘
│
▼
原生可执行文件(无需 JVM)
优势:
- 启动时间:毫秒级(vs JIT 的秒级)
- 内存占用:大幅减少(不含 JIT 编译器和类元数据)
- 部署简单:单文件分发
劣势:
- 编译时间长(分钟级,消耗大量 CPU/内存)
- 动态特性受限(反射、动态代理需配置)
- 峰值性能可能不如 JIT
- 不支持所有 Java 库
JIT vs AOT 对比
| 维度 | JIT (HotSpot/Graal) | AOT (Native Image) |
| 启动时间 | 慢(需预热) | 极快(毫秒级) |
| 峰值性能 | 更高 | 略低(PGO 可接近) |
| 内存占用 | 较高 | 较低 |
| 编译时间 | 运行时 | 构建时(慢) |
| 动态特性 | 完全支持 | 受限(需配置) |
| 调试诊断 | 完善 | 受限 |
| 适用场景 | 长期运行服务 | Serverless、CLI、微服务 |
版本分类
| 版本 | 说明 |
| GraalVM CE | 社区版,开源免费 |
| GraalVM EE | 企业版,性能更优(现已开源核心) |
| Mandrel | Red Hat 维护,专注 Native Image |
| Liberica NIK | BellSoft 维护,增强调试支持 |
2.3 Eclipse OpenJ9
地位:IBM 开发并开源的高性能 JVM,由 Eclipse 基金会管理,专为云环境优化。
发展历程
| 时间 | 事件 |
| 早期 | IBM J9 VM(商业版,IBM JDK 核心) |
| 2017 | 开源为 Eclipse OpenJ9,交由 Eclipse 基金会 |
| 现在 | IBM Semeru Runtime 基于 OpenJ9 |
核心架构
┌─────────────────────────────────────────────────────────────┐
│ Eclipse OpenJ9 │
├─────────────────────────────────────────────────────────────┤
│ ┌─────────────────┐ ┌─────────────────────────────────┐ │
│ │ Eclipse OMR │ │ OpenJ9 特性 │ │
│ │ (底层运行时) │ │ │ │
│ │ │ │ • 共享类缓存 (SCC) │ │
│ │ • GC 框架 │ │ • AOT 编译支持 │ │
│ │ • JIT 编译框架 │ │ • JITServer │ │
│ │ • 端口抽象层 │ │ • 动态类卸载 │ │
│ └─────────────────┘ └─────────────────────────────────┘ │
├─────────────────────────────────────────────────────────────┤
│ 与 OpenJDK 类库结合 = 完整 JDK │
└─────────────────────────────────────────────────────────────┘
核心特性
| 特性 | 说明 |
| 共享类缓存 (SCC) | 跨 JVM 实例共享类元数据,减少启动时间和内存 |
| AOT 编译 | 将方法预编译为本地代码,存储在 SCC 中 |
| JITServer | 将 JIT 编译卸载到远程服务器,降低本地资源消耗 |
| 动态 AOT | 运行时编译热点方法并缓存 |
| -Xquickstart | 快速启动模式,牺牲峰值性能换取启动速度 |
共享类缓存 (SCC) 工作原理
┌─────────────────────────────────────────────────────────────┐
│ Shared Class Cache │
├─────────────────────────────────────────────────────────────┤
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐ │
│ │ 类元数据 │ │ AOT 代码 │ │ 字符串常量等 │ │
│ └─────────────┘ └─────────────┘ └─────────────────────┘ │
└───────────────────────────┬─────────────────────────────────┘
│ 共享内存
┌───────────────────┼───────────────────┐
│ │ │
┌────▼────┐ ┌────▼────┐ ┌────▼────┐
│ JVM 1 │ │ JVM 2 │ │ JVM 3 │
└─────────┘ └─────────┘ └─────────┘
性能对比
┌────────────────────────────────────────────────────────────┐
│ HotSpot vs OpenJ9 对比 │
├──────────────┬───────────────┬─────────────────────────────┤
│ 指标 │ HotSpot │ OpenJ9 │
├──────────────┼───────────────┼─────────────────────────────┤
│ 启动时间 │ 基准 │ 快 ~51% │
│ 启动后内存 │ 基准 │ 低 ~50% │
│ 负载时内存 │ 基准 │ 低 ~33% │
│ 吞吐量 │ 更高 │ 略低 ~5% │
│ 延迟 │ 更低 │ 较高 │
│ 云环境预热 │ 较慢 │ 更快(SCC) │
└──────────────┴───────────────┴─────────────────────────────┘
适用场景
适合 ✅ 不适合 ❌
─────────────────────────────────────────────────────
• 云原生/容器化部署 • 对延迟极度敏感的场景
• Kubernetes 环境 • 需要最高吞吐量的场景
• 微服务架构 • 需要最低 GC 停顿的场景
• 资源受限环境
• 多实例部署(SCC 优势明显)
• Serverless(快启动)
2.4 Azul JVM 系列
Azul Zulu
| 特性 | 说明 |
| 定位 | 基于 OpenJDK 的商业发行版 |
| JVM | 使用 HotSpot |
| 支持 | 免费版 + 商业支持版 |
| 平台 | 支持多种 OS 和架构 |
| 认证 | TCK 认证,兼容性保证 |
Azul Prime (原 Zing)
| 特性 | 说明 |
| 定位 | 超低延迟商业 JVM |
| 核心技术 | C4 GC(Continuously Concurrent Compacting Collector) |
| GC 停顿 | 毫秒级,与堆大小无关 |
| Falcon JIT | 基于 LLVM 的高性能编译器 |
| ReadyNow | 消除预热时间的技术 |
| 适用场景 | 金融交易、实时系统 |
C4 GC 特点
───────────────────────────────────────────────
• 完全并发:标记、重定位、压缩都并发执行
• 无 STW 压缩:独特的 Load Value Barrier 技术
• 停顿时间:<1ms,不随堆增大而增加
• 堆大小支持:可达 TB 级别
2.5 其他 JVM 发行版
| 发行版 | 提供商 | JVM 引擎 | 特点 |
| Eclipse Temurin | Adoptium | HotSpot | 社区维护,高质量,免费 |
| Amazon Corretto | AWS | HotSpot | AWS 优化,长期免费支持 |
| Microsoft Build | Microsoft | HotSpot | Azure 优化 |
| Red Hat Build | Red Hat | HotSpot | RHEL 集成,企业支持 |
| BellSoft Liberica | BellSoft | HotSpot | 多架构,包含 JavaFX |
| SAP Machine | SAP | HotSpot | SAP 应用优化 |
| IBM Semeru | IBM | OpenJ9 | OpenJ9 商业发行版 |
| Alibaba Dragonwell | 阿里巴巴 | HotSpot | 针对阿里云优化 |
| Tencent Kona | 腾讯 | HotSpot | 腾讯云优化 |
三、JVM 技术对比总结
3.1 综合对比
| 维度 | HotSpot | GraalVM JIT | GraalVM Native | OpenJ9 |
| 启动时间 | 中等 | 中等 | 极快 | 快 |
| 峰值性能 | 优秀 | 优秀+ | 良好 | 良好 |
| 内存占用 | 较高 | 较高 | 低 | 低 |
| 预热时间 | 长 | 长 | 无 | 较短 |
| GC 选择 | 丰富 | 丰富 | 有限 | 中等 |
| 动态特性 | 完全 | 完全 | 受限 | 完全 |
| 多语言 | Java 系 | 多语言 | 多语言 | Java 系 |
| 工具链 | 完善 | 完善 | 发展中 | 完善 |
| 社区 | 最大 | 活跃 | 活跃 | 中等 |
3.2 GC 对比
| GC | 所属 JVM | 停顿时间 | 吞吐量 | 内存开销 | 适用堆大小 |
| G1 | HotSpot | 中等 | 高 | 中 | GB~数十GB |
| ZGC | HotSpot | <1ms | 中高 | 较高 | GB~TB |
| Shenandoah | HotSpot | <10ms | 中高 | 中 | GB~数百GB |
| C4 | Azul Prime | <1ms | 高 | 中 | GB~TB |
| Balanced | OpenJ9 | 中等 | 高 | 低 | GB~数十GB |
| gencon | OpenJ9 | 较低 | 中高 | 低 | 中小堆 |
四、JVM 选型指南
4.1 决策流程图
┌─────────────────────┐
│ 选择 JVM │
└─────────┬───────────┘
│
┌───────────▼───────────┐
│ 需要最高峰值性能? │
└───────────┬───────────┘
/ \
是 否
│ │
│ ┌───────▼───────┐
│ │需要快速启动 │
│ │/低内存占用? │
│ └───────┬───────┘
│ / \
│ 是 否
│ │ │
┌────────▼────┐ │ ┌────▼────┐
│需要极低延迟?│ │ │ HotSpot │
└────────┬────┘ │ │ (G1) │
/ \ │ └─────────┘
是 否 │
│ │ │
┌────▼────┐ ┌───▼────▼───┐
│Azul Prime│ │ HotSpot │
│ 或 ZGC │ │(G1/ZGC) │
└─────────┘ └────────────┘
┌───────▼───────┐
│ 容器/微服务? │
└───────┬───────┘
/ \
是 否
│ │
┌───────────▼──────┐ │
│ OpenJ9 或 │ │
│ GraalVM Native │ │
└──────────────────┘ │
│
GraalVM Native
(CLI/Serverless)
4.2 场景推荐
| 场景 | 推荐 JVM | 推荐 GC | 说明 |
| 传统企业应用 | HotSpot | G1 | 成熟稳定,生态完善 |
| 高吞吐后台服务 | HotSpot | Parallel/G1 | 最大化吞吐量 |
| 低延迟交易系统 | Azul Prime/HotSpot | C4/ZGC | 亚毫秒级延迟 |
| 大数据处理 | HotSpot | G1/ZGC | 大堆内存支持 |
| 云原生微服务 | OpenJ9/HotSpot | gencon/G1 | 快启动、低内存 |
| Kubernetes 部署 | OpenJ9 | gencon | SCC 跨实例共享 |
| Serverless/FaaS | GraalVM Native | - | 毫秒级冷启动 |
| CLI 工具 | GraalVM Native | - | 即时启动 |
| 多语言混合 | GraalVM | - | Polyglot 支持 |
| 资源受限容器 | OpenJ9 | gencon | 50% 内存节省 |
4.3 常见配置建议
HotSpot G1 配置
java -Xms4g -Xmx4g \
-XX:+UseG1GC \
-XX:MaxGCPauseMillis=200 \
-XX:G1HeapRegionSize=16m \
-jar app.jar
HotSpot ZGC 配置
java -Xms8g -Xmx8g \
-XX:+UseZGC \
-XX:+ZGenerational \
-jar app.jar
OpenJ9 容器配置
java -Xms512m -Xmx512m \
-Xshareclasses:name=myapp,cacheDir=/cache \
-Xquickstart \
-jar app.jar
GraalVM Native Image
native-image \
--no-fallback \
-H:+ReportExceptionStackTraces \
-jar app.jar
五、参考资源
官方资源
| 项目 | 链接 |
| OpenJDK | https://openjdk.org/ |
| GraalVM | https://www.graalvm.org/ |
| Eclipse OpenJ9 | https://eclipse.dev/openj9/ |
| Azul | https://www.azul.com/ |
| Eclipse Temurin | https://adoptium.net/ |
性能对比资料
0 评论
评论