一、概述
1.1 什么是 GraalVM
GraalVM 是由 Oracle Labs 开发的一款高性能、通用的虚拟机和运行时平台,旨在支持多种编程语言,并提供先进的编译与运行时优化技术。它可以运行使用多种不同语言编写的程序,如 JavaScript、Python、Ruby、R 以及在 Java 虚拟机(JVM)上运行的语言,如 Java、Scala、Groovy、Kotlin、Clojure,或在 LLVM 上运行的语言,如 C 和 C++。此外,它允许在同一运行时中跨语言调用,并提供了优异的性能优化。
GraalVM 能在减少资源消耗的同时提升应用性能,以此提高应用运行效率、降低信息技术成本。其实现方式为将 Java 应用提前编译为原生二进制文件,该二进制文件体积更小,启动速度最高可提升 100 倍,无需预热即可达到峰值性能,相比在 Java 虚拟机(JVM)上运行的应用,还能节省更多内存和 CPU 资源。结合基于剖析的优化技术与 G1(垃圾优先)垃圾回收器,GraalVM 可实现更低的延迟,且峰值性能和吞吐量与 JVM 运行的应用持平甚至更优。
GraalVM for JDK 是 Oracle 推出的高级 JDK 实现,核心特性是提前编译(Ahead-of-Time, AOT)的 Native Image 技术。它将 Java 应用程序提前编译为独立的原生可执行文件,核心特性包括:
- 即时启动:无需 JVM 预热即可达到峰值性能
- 低资源占用:更少的内存和 CPU 消耗
- 紧凑打包:生成小型容器镜像,便于部署
- 增强安全性:排除未使用代码,限制运行时动态特性
- 高性能 JDK:兼容 OpenJDK,可作为标准 Java 虚拟机的替代品,提供更快的运行时性能。
- 多语言支持(Polyglot):原生支持在同一个运行时中无缝互操作 Java、JavaScript、Python、Ruby、R 等语言。
- Graal 编译器:用 Java 编写的全新 JIT 编译器,替代 C2 编译器,提升优化能力。
- Substrate VM(Native Image):支持将 Java 应用提前编译为独立的本地可执行文件(native executable),启动快、内存占用低。
1.2 核心优势
- 低资源占用:经 GraalVM 提前编译的 Java 应用,运行时所需的内存和 CPU 资源更少,无需为即时编译消耗内存和 CPU 运算周期。因此应用运行的资源需求更低,规模化部署后的运维成本也更少。
- 启动速度快:GraalVM 可在构建阶段完成 Java 应用部分模块的初始化,而非运行阶段,让应用启动速度大幅提升,且无需预热就能即时实现可预期的峰值性能。
- 部署包轻量化:经 GraalVM 提前编译的 Java 应用体积小巧,可轻松打包为轻量级容器镜像,实现高效、快速的部署。
- 安全性提升:GraalVM 通过剔除不可达代码(未使用的类、方法和字段)、即时编译基础架构以及构建阶段初始化的代码,减少 Java 应用的攻击面。其'封闭世界假设'机制会在运行时禁用反射、序列化等动态特性,防止应用加载未知代码,且要求在构建阶段显式配置此类类、方法和字段的包含列表。此外,GraalVM 可在二进制文件中嵌入软件物料清单(SBOM),方便用户通过常用安全扫描工具,检查 Java 应用中已公布的通用漏洞和暴露问题(CVE)。
- 轻松构建云原生微服务:Micronaut、Spring Boot、Helidon、Quarkus 等主流微服务框架,以及甲骨文云基础设施(OCI)、亚马逊云科技(AWS)、谷歌云平台(GCP)、微软 Azure 等云平台均支持 GraalVM。借助这一特性,用户可便捷地构建云原生 Java 微服务,将其编译为二进制文件、打包进轻量容器,并部署在各类主流云平台上。
- 为 Java 应用扩展 Python 等多语言能力:通过 GraalVM,用户可在 Java 应用中嵌入 Python、JavaScript 等语言的运行环境,实现应用功能的扩展。
- 兼容现有开发与监控工具:Java 应用原有的开发和监控工具,均可直接用于 GraalVM 编译后的应用二进制文件。GraalVM 提供了适用于 Maven 和 Gradle 的构建插件,以及面向 CI/CD 的 GitHub Actions 组件,同时支持 Java 飞行记录器(JFR)、Java 管理扩展(JMX)、堆转储、VisualVM 等各类监控工具,也能与现有 Java 编辑器/集成开发环境(IDE)、JUnit 等单元测试框架无缝协作。
二、安装指南
2.1 系统要求
GraalVM for JDK 21 支持以下平台:
Linux:
- x64 架构:所有主流发行版
- AArch64 架构:Oracle Linux、RHEL
macOS:
- x64 架构
- AArch64 架构(Apple Silicon)
Windows:
- x64 架构
- ⚠️ Native Image 需要 Visual Studio 2022 (17.1.0+) 和 Windows SDK
2.2 下载安装
方式 1:直接下载(Linux/macOS/Windows)
验证安装
java -version # 输出示例:# openjdk version "21.0.1" 2025-04-15# GraalVM Runtime Environment (build 21.0.1+23.1)# GraalVM VM (build 21.0.1+23.1, mixed mode, sharing)
配置环境变量
export JAVA_HOME=/usr/local/graalvm-jdk-21
export PATH=$JAVA_HOME/bin:$PATH
解压安装
# Linux/macOS
tar -xzf graalvm-jdk-21_linux-x64_bin.tar.gz
sudo mv graalvm-jdk-21/ /usr/local/
下载安装包
# Linux 示例
wget https://download.oracle.com/graalvm/21/latest/graalvm-jdk-21_linux-x64_bin.tar.gz
方式 2:使用 SDKMAN!(Linux/macOS)
# 安装 SDKMAN!
curl -s "https://get.sdkman.io" | bash
source "$HOME/.sdkman/bin/sdkman-init.sh"
# 安装 GraalVM
sdk install java 21.0.1-graal
# 切换使用
sdk use java 21.0.1-graal
2.3 Windows 特殊说明
Native Image 在 Windows 上需要额外的工具链:
- 安装 Visual Studio Build Tools
- 下载:https://visualstudio.microsoft.com/downloads/
- 安装时选择:'Desktop development with C++'
- 确保安装 Windows SDK
验证安装
native-image.cmd --version
三、Native Image 核心概念
3.1 什么是 Native Image
Native Image 是 GraalVM 的核心技术,它将 Java 字节码提前编译为平台特定的原生可执行文件。
工作流程:
- 静态分析:扫描字节码,确定所有可达的程序元素
- 构建时执行:在编译期间执行初始化代码
- AOT 编译:将 Java 代码编译为原生机器码
- 链接:将用户代码、运行时库和初始化结果链接为单一可执行文件
3.2 Build Time vs Run Time
这是 Native Image 的关键概念区别:
Build Time(构建时):
- 在镜像构建期间执行的代码
- 类似于传统编译器的编译期
- 初始化状态保存在镜像堆(image heap)中
Run Time(运行时):
- 镜像启动后执行的代码
- 使用构建时保存的状态
- 无法加载新的代码(封闭世界假设)
示例对比:
public class HelloWorld {
static class Greeter {
static {
System.out.println("Greeter is getting ready!");
}
public static void greet() {
System.out.println("Hello, World!");
}
}
public static void main(String[] args) {
Greeter.greet();
}
}

