Oracle 推出 GraalVM Java JIT 编译器,但仅限于自己的 JDK

科技   2024-12-13 16:38   辽宁  

作者 | Karsten Silz
译者 | 平川
策划 | 丁晓昀

2024 年 9 月,甲骨文公司在其 OpenJDK 发行版 Oracle JDK 23 中添加了一项实验性功能GraalVM JIT 编译器。GraalVM JIT 编译器比标准 OpenJDK JIT 编译器更快,也更易于维护。甲骨文的这一举动引起了争议,因为他们曾研究过将 GraalVM JIT 编译器纳入所有 OpenJDK 发行版,而不仅仅是他们自己的发行版。这项研究的状态目前尚未可知。

Java 需要 JIT 编译器,因为 HotSpot JVM 会在运行时解释与机器无关的 Java 字节码。与 C++ 等语言相比,这个过程要慢得多,因为 C++ 的超前(AOT)编译器会在构建时创建机器代码。在 Java 中,JIT 编译器会在运行时将常用方法(“热点”)的字节码转换为机器代码。

GraalVM JIT 编译器是 Oracle 实验室项目 GraalVM 的成果之一。这是一个面向 Java、JavaScript、Python 和 Ruby 等 JVM 语言的高性能运行时。GraalVM JIT 编译器可以在名为 HotSpot JVM 的标准 OpenJDK 虚拟机中运行。此外,它也可以在 GraalVM JDK(基于 Oracle JDK 的 Java 发行版)中运行。

标准 OpenJDK HotSpot JIT 编译器是一个由 C1 和 C2 编译器组成的分层编译器。这两种编译器都是用 C++ 编写的,并且自 2000 年以来就一直是默认的编译器。与 HotSpot 相比,GraalVM JIT 编译器有一些技术优势,而且是用 Java 编写的,比 C1 和 C2 的 C++ 代码更易于维护。甲骨文发现,使用 GraalVM JIT 编译器运行其云业务软件 NetSuite 时,CPU 消耗一般可降低 6-7%,在某些工作负载中可降低 13%。

GraalVM 还有一个 Java 编译器:本地镜像 AOT 编译器,它将编译和尽可能多的初始化工作转移到构建时。它生成的本地可执行文件可立即启动,并且没有 JIT 编译器。甲骨文表示,借助性能分析引导优化(PGO),本地镜像的峰值性能接近 JIT 编译器,在某些情况下甚至超过了 JIT 编译器。

使用 GraalVM 本地镜像的代价是,可能会出现一些对大多数 Java 应用程序没有影响的限制,而且故障排查的成本会增加不少。多年来,Helidon、Micronaut、Quarkus 和 Spring Boot 等应用程序框架一直都支持 GraalVM 本地镜像。有些库,尤其是比较老的库,并没有提供开箱即用的支持,但通常只要补充下本地镜像的配置数据,就能正常工作。

甲骨文于 2022 年 12 月提出了 OpenJDK 项目 Galahad。其目标是将 GraalVM JIT 编译器和 GraalVM 本地镜像 “贡献给 OpenJDK 社区,并为可能在 JDK 主线版本中孵化它们做好准备”。该项目已于 2023 年初获得批准,但此后几乎没有任何公开活动。

今年 6 月,甲骨文公司的 Douglas Simon表示:“Galahad 项目的目标是使 GraalVM 项目与 OpenJDK 和 Oracle JDK 更好地保持一致。Galahad 主要是为了协调两个团队之间的开发流程,应该不会对 GraalVM 发行版中用户可见的功能产生任何重大影响”。截至 2024 年 11 月,关于 Galahad 项目是否会导致 GraalVM JIT 和 AOT 编译器被纳入未来的 OpenJDK 主线版本,以及何时纳入,均没有明确的消息。目前,也没有明确的消息说明 OpenJDK 主线中的 GraalVM JIT 编译器与 Oracle OpenJD 发行版中的 GraalVM JIT 编译器有何不同。

InfoQ 曾向甲骨文公司咨询过相关问题,但甲骨文公司并未给予答复。

Azul Systems 公司副首席技术官 Simon Ritter 很高兴地回答了有关 JIT 编译器的问题。

InfoQ:大多数 OpenJDK 发行版都附带了 HotSpot C1 和 C2 JIT 编译器。根据您的经验,哪些 Java 应用程序在哪些情况下会受益于不同的 JIT 编译器?

Simon Ritter: 要明确地回答这个问题很难。JIT 编译器的作用是在运行时将 Java 字节码转换为本地机器指令。与单纯解释字节码相比,这样做的好处是大大提高了应用程序的性能。

作为 HotSpot 虚拟机的一部分,C1 和 C2 JIT 编译器早在 JDK 1.2 版本中就已引入,为的是解决 Java 运行速度慢的问题。使用 C1 快速编译代码立即就可以获得性能的提升。之后,使用 C2 重新编译代码,根据收集到的性能分析数据生成最优的本地指令。

替换 C2 可以生成优化程度更高的本地指令,从而提高应用程序的性能。在很大程度上,提升程度取决于代码的实际操作。如果应用程序比较简单,则不太可能有任何性能上的改进,而如果应用程序比较复杂,比如数值密集型应用程序,则可能会有很大的性能提升。归根结底,最好的方法是测试各种替代方案,并确定哪种方案最适合您的应用程序。

InfoQ:Azul 销售的 Prime OpenJDK 发行版包含 Falcon JIT 编译器。Falcon 是如何工作的?

Ritter:Falcon 是 C2 JIT 编译器的替代品,基于开源的 LLVM 编译器项目。LLVM 是可重用模块化编译器和工具链技术的集合。它的大部分工作是将编译生成的代码的中间表示与性能分析数据相结合,生成最优的本地机器指令。利用这一点,Azul 将其集成到了 JVM 中,与垃圾收集器、类加载器等协同工作。这项工作随后又被贡献给了 LLVM 项目。

使用 LLVM 进行 JIT 编译可以获得不同的性能特征。它使用的技术包括更激进的推测优化和更好的自动矢量化,仅举两例。通常,这能带来两位数的性能提升。

InfoQ:与 C2 和 GraalVM JIT 编译器相比,Falcon JIT 编译器怎么样?

Ritter:C2 是 1998 年推出的,其设计是一体的,很难通过修改来提高性能。Falcon 基于 LLVM,它是模块化的,添加新的编译功能要容易得多。

Graal JIT 编译器是用 Java 编写的。同样,修改代码生成方式和改进优化都更简单。目前,Graal JIT 编译器并未包含在 OpenJDK 中,而仅在 Oracle JDK 中作为实验性功能提供。

InfoQ:与其他语言的 JIT 编译器相比,如.NET 或 JavaScript,Java JIT 编译器有什么优势吗?

Ritter: 这个问题也很难给出一个明确的答案。我能想到的最好的回答是,与.NET 和 JavaScript 相比,基于 JVM 的应用程序在服务器端更受欢迎。JVM 具有令人难以置信的可扩展性和健壮性,这也是几乎所有企业关键任务应用程序都选择这一平台的原因。

原文链接:

https://www.infoq.com/news/2024/12/oracle-jdk-graalvm-jit-compiler/

声明:本文为 InfoQ 翻译,未经许可禁止转载。

今日好文推荐

1620 天后,Redis 之父强势归来:开始着手修复社区裂痕,并布局下一代向量数据库

号召全体员工“一起开除老板”!极狐 GitLab 架构师怒斥高层“恐吓免费版用户”,前员工揭 CEO“不懂开源”?

硅谷 1/10 程序员在摸鱼?拿20-30万美元年薪却几乎不干活

我们采访了亚马逊 CTO,但 AI 不是重点

会议推荐

12 月 13 日至 14 日(周五至周六),AICon 全球人工智能开发与应用大会将在北京盛大开幕!本次大会汇聚 70+ 位 AI 及技术领域的顶尖专家,深入探讨大模型与推理、AI Agent、多模态、具身智能等前沿话题。此外还有丰富的圆桌论坛、以及展区活动,带你深入探索大模型的最新实践与未来趋势。年度最后一次 AI 盛宴,让我们一起见证 AI 未来。

InfoQ
为一线互联网公司核心技术人员提供优质内容。科技圈的观察者,前沿技术的传播者。
 最新文章