JVM JIT 编译器 Jeandle
GitHub 地址:
什么是 Jeandle?
Jeandle 是 Java 的即时编译器。它基于 OpenJDK 构建,利用 LLVM 编译器基础设施生成机器代码,旨在提供强大的编译优化并交付高性能代码。
系统设计
概述
Jeandle 是一个功能完备的 JIT 编译器,旨在支持所有 Java 语言特性,包括监视器(monitor)和异常处理(exception)等。此外,Jeandle 还将支持编译器的核心功能,如去优化(deoptimization)和栈上替换(On-Stack Replacement, OSR)。
在运行时,Jeandle 以 Java 字节码作为输入,生成二进制机器码作为输出。其工作流程如下:
Jeandle 编译线程从任务队列中获取编译任务,并调用 JeandleCompiler::compile_method 方法开始编译过程
通过抽象解释器(Abstract Interpreter)将字节码转换为 LLVM IR(中间表示)
应用定制优化器对 LLVM IR 进行优化
将优化后的 IR 传递给 LLVM 后端进行代码生成
LLVM 代码生成器返回的二进制代码经过解析和重定位后,存入代码缓存(Code Cache)中,供 JVM 管理和使用
定制优化器
Jeandle 的定制优化器包含两个主要组成部分:
LLVM 标准优化过程:利用 LLVM 自身提供的成熟优化技术
专为 Java 语言设计的定制优化过程:包括逃逸分析(escape analysis)和类分析(class analysis)等针对 Java 特性的优化技术
这些定制优化技术能够更好地理解和优化 Java 程序的运行时行为,从而生成更高效的机器码。
垃圾回收支持
Jeandle 通过利用 LLVM 的 statepoint 基础设施来支持 HotSpot JVM 中的垃圾回收机制。这一设计确保了在进行垃圾回收时,能够准确地跟踪和管理 Java 对象的生命周期。
关于 LLVM statepoint 的更多详细信息,请参考官方文档:
LLVM Garbage Collection Documentation
LLVM Statepoints Documentation
通过这种设计,Jeandle 能够在享受 LLVM 强大优化能力的同时,完美兼容 JVM 的垃圾回收机制,为 Java 应用提供既高效又稳定的运行环境。
快速入门
获取源码与构建
Jeandle 由两个独立的代码仓库组成jeandle-llvm
和 jeandle-jdk
。这两个仓库需要分别构建,构建过程与其上游仓库相同。需要注意的是,在构建 jeandle-jdk
时,必须使用 --with-jeandle-llvm=<directory>
选项指定 jeandle-llvm
的安装目录。
有关上游 LLVM 和 OpenJDK 的入门指南,请参考其官方文档:
快速开始步骤
1. 克隆 jeandle-llvm 仓库
git clone https://github.com/jeandle/jeandle-llvm.git
2. 配置并构建 jeandle-llvm
cd jeandle-llvm
mkdir build
cd build
cmake -G "Unix Makefiles" -DLLVM_TARGETS_TO_BUILD=X86 -DCMAKE_BUILD_TYPE="Release" -DCMAKE_INSTALL_PREFIX="/home/jeandle-llvm-install" -DLLVM_BUILD_LLVM_DYLIB=On -DLLVM_DYLIB_COMPONENTS=all ../llvm
cmake --build . --target install
3. 克隆 jeandle-jdk 仓库
git clone https://github.com/jeandle/jeandle-jdk.git
4. 配置并构建 jeandle-jdk
cd jeandle-jdk
bash configure \
--with-boot-jdk=/usr/local/java-21-openjdk-amd64/ \
--with-debug-level=release \
--with-jeandle-llvm=/home/jeandle-llvm-install
make images
构建完成后,编译好的 JDK 可以在 jeandle-jdk
路径下的 build/linux-x86_64-server-release/images/jdk/
目录中找到。
调试版本构建
jeandle-llvm
和 jeandle-jdk
必须配置相同的调试级别。要构建 Jeandle 的调试版本,请使用以下构建选项:
# 对于 jeandle-llvm
-DCMAKE_BUILD_TYPE="Debug"
# 对于 jeandle-jdk
--with-debug-level=slowdebug
支持的平台
Jeandle 目前仅支持 X86 架构。Aarch64 架构的支持正在计划中。此外,借助 LLVM 强大的生态系统和成熟的后端支持,其他后端也可以根据需求进行支持。
使用 Jeandle
要启用 Jeandle,需要使用 JVM 标志 -XX:+UseJeandleCompiler
。
示例:Fibonacci 程序
public class Main {
public static int fibonacci(int n) {
if (n == 0) {
return 0;
} else if (n == 1) {
return 1;
} else {
return fibonacci(n - 1) + fibonacci(n - 2);
}
}
public static void main(String[] args) {
int num = 10;
for (int i = 0; i < num; i++) {
System.out.print(fibonacci(i) + " ");
}
}
}
控制编译过程
要跳过解释器并控制哪些方法需要编译,可以使用以下命令运行 Jeandle:
javac Main.java
java -XX:-TieredCompilation -Xcomp \
-XX:CompileCommand=compileonly,Main::fibonacci \
-XX:+UseJeandleCompiler Main
输出结果
0 1 1 2 3 5 8 13 21 34
通过以上步骤,您就可以成功构建并使用 Jeandle 这一基于 LLVM 的新一代 JVM JIT 编译器,体验其带来的性能提升。
评论