GitHub 地址:

什么是 Jeandle?

Jeandle 是 Java 的即时编译器。它基于 OpenJDK 构建,利用 LLVM 编译器基础设施生成机器代码,旨在提供强大的编译优化并交付高性能代码。

系统设计

概述

Jeandle 是一个功能完备的 JIT 编译器,旨在支持所有 Java 语言特性,包括监视器(monitor)和异常处理(exception)等。此外,Jeandle 还将支持编译器的核心功能,如去优化(deoptimization)和栈上替换(On-Stack Replacement, OSR)。

Overview

在运行时,Jeandle 以 Java 字节码作为输入,生成二进制机器码作为输出。其工作流程如下:

  1. Jeandle 编译线程从任务队列中获取编译任务,并调用 JeandleCompiler::compile_method 方法开始编译过程

  2. 通过抽象解释器(Abstract Interpreter)将字节码转换为 LLVM IR(中间表示)

  3. 应用定制优化器对 LLVM IR 进行优化

  4. 将优化后的 IR 传递给 LLVM 后端进行代码生成

  5. LLVM 代码生成器返回的二进制代码经过解析和重定位后,存入代码缓存(Code Cache)中,供 JVM 管理和使用

定制优化器

Jeandle 的定制优化器包含两个主要组成部分:

  1. LLVM 标准优化过程:利用 LLVM 自身提供的成熟优化技术

  2. 专为 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-llvmjeandle-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-llvmjeandle-jdk 必须配置相同的调试级别。要构建 Jeandle 的调试版本,请使用以下构建选项:

# 对于 jeandle-llvm

-DCMAKE_BUILD_TYPE="Debug"

# 对于 jeandle-jdk

--with-debug-level=slowdebug

支持的平台

Jeandle 目前仅支持 X86 架构。Aarch64 架构的支持正在计划中。此外,借助 LLVM 强大的生态系统和成熟的后端支持,其他后端也可以根据需求进行支持。

操作系统

架构

状态

Linux

X86

已支持

Linux

Aarch64

计划中

使用 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 编译器,体验其带来的性能提升。