主流 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 应用运行其上。

发展历程

时间事件
1999Sun Microsystems 发布 HotSpot
2006Sun 开源 Java,成立 OpenJDK
2010Oracle 收购 Sun,获得 HotSpot 和 JRockit
JDK 8完成 HotSpot 与 JRockit 整合(Mission Control 等)
JDK 9G1 成为默认 GC
JDK 11引入 ZGC(实验性)
JDK 12加入 Shenandoah GC
JDK 15ZGC 正式可用
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引入版本特点适用场景
SerialJDK 1.3单线程,STW小内存、客户端
ParallelJDK 1.4多线程,高吞吐批处理、后台任务
CMSJDK 1.4并发标记清除,低停顿已废弃(JDK 14)
G1JDK 7分区收集,可预测停顿通用场景(默认)
ZGCJDK 11超低延迟(<1ms),TB级堆大内存、延迟敏感
ShenandoahJDK 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企业版,性能更优(现已开源核心)
MandrelRed Hat 维护,专注 Native Image
Liberica NIKBellSoft 维护,增强调试支持

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 TemurinAdoptiumHotSpot社区维护,高质量,免费
Amazon CorrettoAWSHotSpotAWS 优化,长期免费支持
Microsoft BuildMicrosoftHotSpotAzure 优化
Red Hat BuildRed HatHotSpotRHEL 集成,企业支持
BellSoft LibericaBellSoftHotSpot多架构,包含 JavaFX
SAP MachineSAPHotSpotSAP 应用优化
IBM SemeruIBMOpenJ9OpenJ9 商业发行版
Alibaba Dragonwell阿里巴巴HotSpot针对阿里云优化
Tencent Kona腾讯HotSpot腾讯云优化

三、JVM 技术对比总结

3.1 综合对比

维度HotSpotGraalVM JITGraalVM NativeOpenJ9
启动时间中等中等极快
峰值性能优秀优秀+良好良好
内存占用较高较高
预热时间较短
GC 选择丰富丰富有限中等
动态特性完全完全受限完全
多语言Java 系多语言多语言Java 系
工具链完善完善发展中完善
社区最大活跃活跃中等

3.2 GC 对比

GC所属 JVM停顿时间吞吐量内存开销适用堆大小
G1HotSpot中等GB~数十GB
ZGCHotSpot<1ms中高较高GB~TB
ShenandoahHotSpot<10ms中高GB~数百GB
C4Azul Prime<1msGB~TB
BalancedOpenJ9中等GB~数十GB
genconOpenJ9较低中高中小堆

四、JVM 选型指南

4.1 决策流程图

                      ┌─────────────────────┐
                      │     选择 JVM        │
                      └─────────┬───────────┘
                                │
                    ┌───────────▼───────────┐
                    │  需要最高峰值性能?    │
                    └───────────┬───────────┘
                          /           \
                        是             否
                        │              │
                        │      ┌───────▼───────┐
                        │      │需要快速启动    │
                        │      │/低内存占用?   │
                        │      └───────┬───────┘
                        │          /       \
                        │        是         否
                        │        │          │
               ┌────────▼────┐   │     ┌────▼────┐
               │需要极低延迟?│   │     │ HotSpot │
               └────────┬────┘   │     │  (G1)   │
                   /       \     │     └─────────┘
                 是         否   │
                 │          │    │
            ┌────▼────┐ ┌───▼────▼───┐
            │Azul Prime│ │  HotSpot   │
            │ 或 ZGC  │ │(G1/ZGC)    │
            └─────────┘ └────────────┘
                              
                        ┌───────▼───────┐
                        │  容器/微服务? │
                        └───────┬───────┘
                            /       \
                          是         否
                          │          │
              ┌───────────▼──────┐   │
              │ OpenJ9 或        │   │
              │ GraalVM Native   │   │
              └──────────────────┘   │
                                     │
                              GraalVM Native
                              (CLI/Serverless)

4.2 场景推荐

场景推荐 JVM推荐 GC说明
传统企业应用HotSpotG1成熟稳定,生态完善
高吞吐后台服务HotSpotParallel/G1最大化吞吐量
低延迟交易系统Azul Prime/HotSpotC4/ZGC亚毫秒级延迟
大数据处理HotSpotG1/ZGC大堆内存支持
云原生微服务OpenJ9/HotSpotgencon/G1快启动、低内存
Kubernetes 部署OpenJ9genconSCC 跨实例共享
Serverless/FaaSGraalVM Native-毫秒级冷启动
CLI 工具GraalVM Native-即时启动
多语言混合GraalVM-Polyglot 支持
资源受限容器OpenJ9gencon50% 内存节省

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

五、参考资源

官方资源

项目链接
OpenJDKhttps://openjdk.org/
GraalVMhttps://www.graalvm.org/
Eclipse OpenJ9https://eclipse.dev/openj9/
Azulhttps://www.azul.com/
Eclipse Temurinhttps://adoptium.net/

性能对比资料

资源说明
HotSpot vs OpenJ9BellSoft 性能对比
OpenJ9 PerformanceOpenJ9 官方性能数据
GraalVM DocsGraalVM 官方文档