50万奖金+官方证书,深圳国际金融科技大赛正式启动,点击报名 了解详情
写点什么

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

作者:Karsten Silz

  • 2024-12-25
    北京
  • 本文字数:2371 字

    阅读完需:约 8 分钟

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

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/

2024-12-25 08:059970

评论

发布
暂无评论

ToolLLM:能够使用 16000 种真实 API 的 LLM

Zilliz

AIGC Towhee LLM

javascript之webAPIs(1)

timerring

JavaScript

新利好带动 POSE 持续上扬,月内几近翻倍

BlockChain先知

新利好带动 POSE 持续上扬,月内几近翻倍

股市老人

【我和openGauss的故事】openGauss 主备架构及同步复制模式理论学习与验证测试

daydayup

【NodeJS】GLIBC_2.28 not found CentOS7不兼容Node高版本

ReturnTmp

node.js centos

怎么快速更新Python的第三方库?教你一招,小白也能学会

程序员晚枫

Python 编程 计算机 第三方库

【Linux】云服务器自动化部署VuePress博客(Jenkins)

ReturnTmp

jenkins vuepress

Spring 架构

小万哥

Java spring 后端 springboot SpringCloud

山东布谷科技直播平台搭建游戏开发技术分享:数据存储的重要意义

山东布谷科技

软件开发 游戏 数据存储 源码搭建 直播平台搭建

【我和openGauss的故事】Navicat连接openGauss_5.0.0 企业版数据库

daydayup

【我和openGauss的故事】openGauss5.0在某省医保局实时数仓应用

daydayup

openGauss-graph 0.2.0版本正式上线

daydayup

go-zero 是如何实现令牌桶限流的?

AlwaysBeta

Go 源码 微服务 go-zero 限流器

2023-08-10:景区里有m个项目,也就是项目数组为int[][] game,这是一个m*2的二维数组 景区的第i个项目有如下两个参数: game[i] = { Ki, Bi } Ki一定是负数,

福大大架构师每日一题

左程云 福大大架构师每日一题

瓴羊Quick BI报表工具助企业洞察市场趋势,让数据说话

对不起该用户已成仙‖

14. 练习:登录注册系统

茶桁

Python 练习 登录注册

SpringBoot3分库分表

Java 架构 springboot SpringBoot3

【我和openGauss的故事】openGauss5.0特性:CM支持VIP仲裁特性

daydayup

openGauss数据库源码解析系列文章——安全管理源码解析(三)

daydayup

openGauss数据库源码解析系列文章——安全管理源码解析(四)

daydayup

作为网络报表分析工具的Quick BI,其功能如何

夜雨微澜

C++友元函数和友元类的使用

芯动大师

c++ 友元

新利好带动 POSE 持续上扬,月内几近翻倍

鳄鱼视界

Programming abstractions in C阅读笔记:p91-p106

codists

Oracle 推出 GraalVM Java JIT 编译器,但仅限于自己的 JDK_编程语言_InfoQ精选文章