OpenJDK 提出 Project Galahad 合并 GraalVM 原生编译
共 2202字,需浏览 5分钟
·
2022-12-22 09:06
OpenJDK 项目提出了一个新项目——代号为 Galahad——将 GraalVM 社区版代码库的某些部分合并到 OpenJDK 中。
这是一项长期努力的最新进展,旨在提供在程序执行前将 Java 应用程序编译为机器代码的能力。从表面上看,这似乎有些奇怪——毕竟,新的 Java 开发人员学习的第一件事就是“Java 不编译为机器代码,而是编译为 JVM 字节码”。
这个简单的格言具有深远的影响,其中最基本的是 Java 平台依赖于强大的动态运行时 - JVM - 来执行。此运行时支持动态运行时技术,例如类加载和反射,这些技术在提前 (AOT) 编译语言中实际上没有类似物。事实上,这是 Java 众多强大功能的起点,也是它在大约 25 年前进入软件领域时如此具有开创性的原因。
尽管如此,人们一直对 Java 程序可以直接编译为机器代码并在没有 JVM 的情况下独立执行的可能性感兴趣。这种愿望有几个不同的原因——无论是为了减少 Java 应用程序达到峰值性能的预热时间,还是为了减少 Java 应用程序的内存需求,或者甚至只是为了避免将资源用于应用程序的运行时子系统可能不需要。
已经有几个项目试图实现这种可能性。最近的,也可以说是迄今为止最成功的,是 GraalVM 项目。这个项目不是来自 OpenJDK,而是来自 Oracle 实验室的一个研究项目。第一个生产级版本 GraalVM 19.0 于 2019 年 5 月发布。
从那时起,它作为一个独立的项目运行,具有不同的发布周期并且与 OpenJDK 的交互有限。与 GraalVM 相关的少数几个 Java 增强建议 (JEP) 中有两个是:
JEP 243:Java 级 JVM 编译器接口
JEP 295:提前编译
这两个 JEP 都出现在 Java 9 中,并且它们一起将 Graal 编译器引入了 OpenJDK 代码库。
Graal 编译器是 GraalVM 的主要组件之一——它是一个对 Java 字节码进行操作并生成机器代码的编译器。它可以在 JIT 或 AOT 模式下运行。
在前者中,它可以用来代替 C2(有时称为“服务器编译器”)。重要的是要注意 Graal 本身是用 Java 编写的——不像其他 JVM 可用的 JIT 编译器是用 C++ 编写的。
Graal 在 Java 10 中作为基于 Java 的实验性 JIT 编译器提供,作为JEP 317。但是,在 Java 17(2021 年 9 月发布)中,AOT 和 JIT 编译器的实验形式都被移除了。尽管如此,仍保留了实验性 Java 级 JVM 编译器接口 (JVMCI)——因此仍然可以使用外部构建版本的 Graal 编译器进行 JIT 编译。
如果按预期交付,最新公告将标志着 Graal 回归 OpenJDK 代码库。然而,也许更重要的是 GraalVM 流程和项目的变化。Galahad 将作为 OpenJDK 子项目运行,并维护一个单独的 repo,该 repo 会定期在主线 repo 上进行 rebase。当功能准备就绪时,它们将被迁移到主线仓库。这与长期运行的项目(如 Loom 和 Lambda)成功使用的模型相同。
Galahad 将 JDK 20 作为初始基准。这本质上是一个代码和技术起点,因为JDK 20 已经进入 Rampdown——因此至少在 JDK 21(预计 2023 年 9 月)之前,不可能将任何重新引入的 Graal 代码作为 Java 的一部分进行交付。目前,Galahad 将专注于贡献最新版本的 GraalVM JIT 编译器并将其集成为 C2 的替代方案。后续会加入一些必要的AOT编译技术,让Graal JIT编译器在JVM启动时立即可用。
这是必要的,因为 Graal 是用 Java 编写的,它可能会遇到与此大致相似的慢启动问题:
Hotspot 从 C1 编译器和可用的 Graal 开始Graal 在 Java 解释器线程上执行,最初速度很慢,直到它自行编译将 Graal 编译器预编译为本机代码将是解决此问题的一种可能性 -一个旧的 Draft JEP指出了这一点,但目前尚不清楚它是否会恢复或开始新的工作。
应该注意的是,并不是所有的 GraalVM 代码库都会被提交——只有核心 JIT 和 AOT 组件,以及 Native Image 工具。GraalVM Enterprise Edititon 中的 Oracle 专有特性预计不会捐赠给该项目。
Galahad 从一份令人印象深刻的提交者名单开始——不仅来自 Oracle 的 OpenJDK 和 GraalVM 团队,还包括来自更广泛的 OpenJDK 社区的许多贡献者,包括来自 Red Hat 的 Andrew Dinn 和 Dan Heidinga 以及来自 AWS 的 Roman Kennke。Galahad 和 Leyden 项目(另一个关注 AOT 编译和相关技术的 OpenJDK 项目)之间的确切关系尚未明朗,但 Galahad 的几个列出的贡献者也一直活跃在 Leyden。
尽管该项目仍处于早期阶段,但许多有影响力的社区成员对 Galahad 表示欢迎,因为它代表了在寻求使 Java 保持在云原生技术堆栈最前沿的过程中又向前迈出了重要一步。