GraalVM 简介
GraalVM 是由 Oracle 开发的一种高性能、多语言虚拟机,基于 Java HotSpot 虚拟机,并引入了新的即时编译器(Graal 编译器)和原生镜像生成工具(Native Image)。GraalVM 的目标是提供更快的执行速度、更低的资源消耗以及对多种编程语言的支持。
核心特性
1. 高性能 JIT 编译器
- GraalVM 自带一个用 Java 编写的高级即时编译器(Graal Compiler),可以替代传统的 C++ 实现的 C2 编译器。
- 支持更复杂的优化策略,提升长时间运行的应用性能。
2. Native Image 原生镜像
- 将 Java 或 JVM 语言(如 Kotlin、Scala、Groovy)提前编译为 原生可执行文件(无需 JVM)
- 启动时间极快(毫秒级)、内存占用低
- 超级适合用于微服务、Serverless、CLI 工具等场景
3. 多语言支持
GraalVM 支持在同一个运行时中执行多种语言:
- JavaScript / Node.js
- Python (limited)
- Ruby
- R
- WebAssembly (WASI)
- LLVM-based languages via Truffle 框架
主要组件
|
组件 |
描述 |
|
Graal Compiler |
高性能的即时编译器(JIT) |
|
Truffle |
多语言解释器框架,支持构建语言实现 |
|
Sulong |
支持 LLVM IR 的运行时,可执行 C/C++ 程序 |
|
Native Image |
将 Java 应用编译为原生可执行文件 |
安装 GraalVM
可以从以下链接下载 GraalVM:
https://www.graalvm.org/downloads/
示例:安装 GraalVM CE(Linux/macOS)
# 解压后配置环境变量
export JAVA_HOME=/path/to/graalvm
export PATH=$JAVA_HOME/bin:$PATH
安装 Native Image 构建工具(需要额外安装)
gu install native-image
使用 GraalVM Native Image 编译 Java 程序为原生可执行文件
示例代码:
// HelloWorld.java
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, GraalVM!");
}
}
编译步骤:
javac HelloWorld.java
# 使用 native-image 编译为原生可执行文件
native-image HelloWorld
# 执行生成的原生程序
./helloworld
输出结果:
Hello, GraalVM!
✅ 输出的是一个独立的二进制文件,不需要 JVM 即可运行!
⚙️ Native Image 工作原理简述
GraalVM Native Image 在构建阶段进行 静态分析,找出所有在运行时会用到的类、方法、字段等信息,并将它们编译为机器码。这个过程称为“封闭世界假设”(Closed World Assumption)。
限制与注意事项:
- 反射必须显式注册(使用 –initialize-at-build-time 或 JSON 配置)
- 动态类加载受限
- 不支持某些 Java 特性(如动态代理、Instrumentation API)
- 构建过程较慢,但运行速度快
️ 常见命令与参数
|
命令 |
描述 |
|
native-image –help |
查看协助文档 |
|
native-image -H:Name=output_name |
设置输出文件名 |
|
native-image -H:Class=MyMainClass |
指定主类 |
|
native-image –no-fallback |
强制构建失败时不回退到 JVM 模式 |
|
native-image –report-unsupported-elements-at-runtime |
运行时报告不支持的反射等特性 |
与 Spring Boot 集成(Spring Native)
GraalVM 原生镜像在 Spring Boot 中得到了官方支持,通过 Spring Native 项目可以将 Spring Boot 应用打包为原生可执行文件。
步骤简略:
- 添加 Spring Native 插件到 pom.xml
- 使用 Maven 或 Gradle 构建
- 使用 native-image-maven-plugin 编译为原生镜像
GraalVM vs 传统 JVM 对比
|
特性 |
传统 JVM |
GraalVM Native Image |
|
启动时间 |
秒级 |
毫秒级 |
|
内存占用 |
较高 |
极低 |
|
编译方式 |
JIT |
AOT |
|
是否依赖 JVM |
是 |
否 |
|
支持语言 |
Java/Kotlin/Scala 等 |
多语言 + 原生执行 |
|
构建耗时 |
快 |
较慢 |
|
反射支持 |
完全支持 |
需要在构建时注册 |
使用场景推荐
|
场景 |
推荐程度 |
说明 |
|
微服务 |
✅✅✅ |
快速启动、低内存 |
|
Serverless 函数 |
✅✅✅ |
极低冷启动延迟 |
|
CLI 工具 |
✅✅✅ |
无 JVM 依赖,跨平台 |
|
大型企业应用 |
⚠️ |
需处理复杂反射、动态代理问题 |
|
多语言脚本混合开发 |
✅✅ |
JS、Python、Ruby 等无缝调用 |

收藏了,感谢分享