Oracle JDK 23 引入 GraalVM JIT 编译器作为实验性功能
2024年9月,Oracle 在其 OpenJDK 发行版 Oracle JDK 23 中引入了 GraalVM 即时编译器(JIT)作为实验性功能。GraalVM JIT 编译器比标准的 OpenJDK JIT 编译器更快且更易于维护。这一举措引发了争议,因为 Oracle 正在研究将其 GraalVM JIT 编译器纳入所有 OpenJDK 发行版,而不仅仅是其自身的发行版。目前,该研究的状态尚不明确。
Java 需要 JIT 编译器的原因
Java 需要 JIT 编译器,因为 HotSpot JVM 在运行时解释 Java 的与机器无关的字节码,这比 C++ 等语言慢得多。在 Java 中,JIT 编译器将常用方法(“热点”)的字节码在运行时转换为机器码。
GraalVM JIT 编译器的背景
GraalVM JIT 编译器是 Oracle 实验室项目 GraalVM 的成果之一,GraalVM 是一个高性能运行时,支持 Java、JavaScript、Python 和 Ruby 等 JVM 语言。GraalVM JIT 编译器可以在标准的 OpenJDK 虚拟机 HotSpot JVM 中运行,也可以在基于 Oracle JDK 的 GraalVM JDK 中运行。
GraalVM JIT 编译器的技术优势
标准的 OpenJDK HotSpot JIT 编译器是一个由 C1 和 C2 编译器组成的分层编译器,两者均用 C++ 编写,自 2000 年以来一直是默认的编译器。GraalVM JIT 编译器在技术上优于 HotSpot,并且是用 Java 编写的,比 C1 和 C2 的 C++ 代码更易于维护。Oracle 发现,使用 GraalVM JIT 编译器运行其云业务软件 NetSuite 时,CPU 消耗总体减少了 6-7%,在某些工作负载下减少了 13%。
GraalVM Native Image AOT 编译器
GraalVM 还有一个 Native Image AOT 编译器,它将编译和尽可能多的初始化工作移至构建时,生成的原生可执行文件可以立即启动且没有 JIT 编译器。使用 Profiling-Guided Optimization (PGO),Oracle 表示 Native Image 可以达到接近 JIT 编译器的峰值性能,在某些情况下甚至超过它。
GraalVM Native Image 的局限性
使用 GraalVM Native Image 的代价是一些可能影响某些 Java 应用程序的限制和更昂贵的故障排除过程。许多应用框架如 Helidon、Micronaut、Quarkus 和 Spring Boot 已经支持 GraalVM Native Image 多年。一些库,尤其是较旧的库,不能直接使用,但通常可以通过为 Native Image 提供配置数据来解决问题。
Project Galahad
Oracle 于 2022 年 12 月提出了 OpenJDK 项目 Project Galahad,旨在将 GraalVM JIT 编译器和 GraalVM Native Image 贡献给 OpenJDK 社区,并为它们在 JDK 主线版本中孵化做准备。该项目于 2023 年初获得批准,但自那以后几乎没有公开活动。
项目 Galahad 的目标
2024 年 6 月,Oracle 的 Douglas Simon 表示,Galahad 项目的目标是更好地对齐 GraalVM 项目与 OpenJDK 和 Oracle JDK,主要是对齐两个团队之间的开发过程,而不应对 GraalVM 发行版中用户可见的功能产生重大影响。截至 2024 年 11 月,尚不清楚 Galahad 项目是否会导致 GraalVM JIT 和 AOT 编译器被纳入未来的 OpenJDK 主线版本,以及何时会发生。此外,OpenJDK 主线中的 GraalVM JIT 编译器与 Oracle OpenJDK 发行版中的编译器有何不同也尚不明确。
Azul Systems 的 Simon Ritter 对 JIT 编译器的看法
Azul Systems 的副 CTO Simon Ritter 表示,JIT 编译器的作用是在运行时将 Java 字节码转换为本机机器指令,从而显著提高应用性能。C1 和 C2 JIT 编译器是为了解决 Java 速度慢的问题而引入的。C1 快速编译代码以提供即时性能改进,而 C2 则根据收集的性能分析数据重新编译代码以生成优化的本机指令。
Ritter 还介绍了 Azul 的 Prime OpenJDK 发行版中的 Falcon JIT 编译器,该编译器基于开源 LLVM 编译器项目,能够通过更积极的推测优化和更好的自动向量化等技术提供两位数的性能提升。与 C2 相比,Falcon 的设计更模块化,易于添加新编译功能。Graal JIT 编译器用 Java 编写,修改代码生成和优化也更容易,但目前仅在 Oracle JDK 中作为实验性功能提供。
Java JIT 编译器与其他语言的比较
Ritter 表示,JVM 在服务器端应用中的普及程度远远超过 .NET 和 JavaScript,这证明了 JVM 的可扩展性和鲁棒性,这也是几乎所有企业关键任务应用选择该平台的原因。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。