【ArchSummit】如何通过AIOps推动可量化的业务价值增长和效率提升?>>> 了解详情
写点什么

Leyden 延迟了 OpenJDK AOT 编译器,转而优化 JIT 编译器

作者:Karsten Silz

  • 2022-07-13
  • 本文字数:3556 字

    阅读完需:约 12 分钟

Leyden延迟了OpenJDK AOT编译器,转而优化JIT编译器

Leyden项目的目标是“解决 Java 启动时间慢、达到性能峰值慢和占用空间大等长期痛点问题”。它想通过在 OpenJDK 中“引入静态镜像的概念”来实现这一目标。静态镜像来自于对原生可执行文件的提前(Ahead-of-Time,AOT)编译。在两年没有公开的活动之后,Leyden 项目在 2022 年 5 月改变了方向,首先优化即时(Just-in-Time,JIT)编译。由此产生的优化几乎肯定要比最初计划的要弱,它最早会在 2025 年底交付给主流 Java 开发者。Oracle 的 Graal 项目已经实现了 Leyden 项目的目标,但其代价是该项目目前竭力想避免的。


Graal 项目起源于 Oracle Labs,并不是 OpenJDK 的一部分。它的GraalVM Native Image是一个 Java AOT 编译器,如今能够生成原生可执行文件。与 Java 的 JIT 编译器相比,它们有四个优势,即启动更快、内存和 CPU 占用更低、安全漏洞更少以及文件更小。


但是,这些成就是有代价的,那就是 GraalVM Native Image 对 Java 应用有一个所谓的封闭性假设(closed-world assumption)的要求,这对所有的 Java 的应用来说都是很难接受的。为什么呢?因为 Java 是一个动态语言,它在运行时赋予了应用很多的权力,比如反射、类加载,甚至构建类。有些特性在 GraalVM Native Image 的封闭世界里是无法正常运行的。这也就是 Leyden 项目现在想要“探索比封闭性假设更弱的约束,并发现它们能够实现哪些优化”的原因。尽管如此,Leyden 项目“依然有希望[...]生成完全静态的镜像”,只不过“这是长期来看”的目标了。

OpenJDK 以前曾经尝试过 AOT 编译

Leyden 项目是 OpenJDK 对 AOT 编译的第二次尝试。第一次尝试是 JEP 295 Ahead-of-Time Compilation 的jaotc,并于 2017 年 9 月在 JDK 9 中交付。与 GraalVM Native Image 类似,它使用了 Graal 项目。但是,与 GraalVM Native Image 不同的是,它非常不受欢迎:当 Oracle 在 Java 16 构建版中移除jaotc时,“没有受到任何人的抱怨”。于是,Oracle 在 JDK 17 中,基于 JEP 410 Remove the Experimental AOT and JIT Compiler,干脆利落地移除了它。


对于 OpenJDK 项目来说,Leyden 有着不同寻常的历史。Java 语言的架构师 Mark Reinhold 在 2020 年 4 月提出了它,随后,OpenJDK 在 2020 年 6 月将其批准为一个项目。但是,从批准到 2022 年 5 月创建邮件列表的两年时间里,没有看到该项目任何明显的进展。这也就是该项目为何刚刚起步,现在主要关注的是“概念,而不是代码”的原因。Reinhold 指出,像“HotSpot JVM、C2 编译器、应用类数据共享(application class-data sharing,CDS)以及 jlink 链接工具”都是优化的目标。值得注意的是,列表里缺失的一个组件是CRaC,它是一个 OpenJDK 项目,能够通过在磁盘中加载 Java 应用来减少启动时间。


通过反推可以得出可能的交付日期。现在,LTS 版本的重要性已经超出了预期。Ben Evans,之前就职于性能监控公司 New Relic,在 Devoxx UK 2022 上宣布“没有任何一个非LTS版本的市场份额超过了1%”。这表明,主流的 Java 开发人员只会从一个 Java LTS 版本迁移至另一个 LTS 版本。


因为 Leyden 项目现在刚刚开始,估计很少有成果能够以生产可用的状态进入 2023 年 9 月份发布的 JDK 21(也就是下一个LTS版本)。所以,主流 Java 开发人员可能只有在 2025 年 9 月的 LTS 版本(JDK 25)中才能看到 Leyden 项目的第一批成果。基于这样的假设,Leyden 项目最早会在 2027 年 9 月通过 JDK 29 向原生可执行文件提供 AOT 编译功能。InfoQ 将继续关注 Leyden 项目的进展。

Spring Boot 对 Leyden 项目的反应

在 Leyden 考虑的特性中,至少有一些需要应用框架的支持才能发挥最佳效果,比如jlink或 CRaC。所以,InfoQ 联系了 Spring Boot、Quarkus 和 Micronaut 的开发者,了解他们对 Leyden 公告的初步反应。

Spring Framework 的项目负责人 Juergen Hoeller 对 Leyden 项目表示了认可:


Leyden 项目是一个很有前途的倡议,与我们在 Spring Framework 6 和 Spring Boot 3 的大方向上是一致的。


Hoeller 还欣然接受在 Spring 中支持 CRaC:


CRaC 堆快照可以作为改善 Spring 应用的启动时间的通用方案。在应用启动的最后阶段生成快照,此时几乎没有任何处于打开状态的文件或网络资源,这符合 CRaC 的预期。Spring 甚至已经在应用上下文刷新结束时重置了它的通用缓存,在用请求相关的元数据动态地重新填充缓存之前清除了启动相关的元数据。在 [......] 应用上下文对快照事件的具体反应,以及改进通用组件的“快照安全”方面,我们肯定会在技术上可行的情况下,在 Spring Framework 6.x 产品线中努力为早期采用者赋予更多的能力。


Hoeller 认为 Spring 将会很快支持jlink和 Java 平台模块系统(Java Platform Module System ,JPMS):


目前的 Spring Framework 6.0 的里程碑版本还不包括 module-info 描述符。但这在 9 月份 M6 里程碑版本的路线图上,在我们进入 6.0 的发布候选阶段时,会重新评估第三方生态系统的模块系统就绪情况。由于 Leyden 项目有可能将jlink变成一个更强大、更通用的工具,所以我们计划不仅为jlink目前的能力做好准备,也会考虑它进一步的演进。

Quarkus 对 Leyden 项目的反应

Quarkus 的联合创始人和共同负责人 Jason Greene 对 Leyden 项目发表了评论:


我们对 Leyden 项目修改 Java 语言规范以更好地支持静态镜像、原生编译和其他技术(如 JVM 检查点)的目标感到最为兴奋。此外,我们很高兴看到封闭性假设仍然可能是该项目的长期目标。


Greene 也欣然接受在 Quarkus 中支持 CRaC:


最近,对 CRaC 研究项目的初步支持已经由 CRaC 的负责人贡献给了 Quarkus 项目。不管运行时的目标类型是什么,Quarkus 都会进行构建时的优化,所以在 OpenJDK 上运行时,我们依然能够看到相当可观的成本节省,而不仅限于 GraalVM。在 OpenJDK 之上添加检查点的方式,比如 CRaC,能够进一步优化启动时间。它无法带来类似于原生镜像那样的成本节省,但是对倾向于或必须采用 JVM 执行的应用来讲,未来这都是一个很有意思的可选方案。


但是,Greene 对于在 Quarkus 中使用jlink和 JPMS 并没有表现出太高的热情:


截止到目前为止,jlink只是为基于 JVM 的应用的存储开销带来了好处(不管有没有它,内存开销和启动时间基本上都是一样的)。但是,在容器和 Kubernetes 应用中,常见的实践是在标准 JVM 基础镜像上建立新的层,这已经比将所有的应用切换到jlink上带来了更多的成本节省(因为每个人都会打包自己裁剪过的 JVM)。在原生镜像的场景中,JVM 的细粒度元素编译到了镜像中,所以在这种情况下,jlink也提供不了什么帮助。同样,对于 JPMS,Quarkus 已经通过 Quarkus 扩展实现了自己的模块化理念,允许我们将依赖集修剪到只包含所需的内容。Quarkus 所采取的方式与简单扁平化 classpath 是兼容的,这也是大多数 Java 生态系统和构建工具如今所偏爱的方式。在成本方面,如果按照jlink的要求转向纯 JPMS 模块(没有自动模块),那么将意味着不仅对 Quarkus,还对 Quarkus 构建所需的大量的库都会产生破坏性的变更。在考虑进行转换之前,我们希望看到这些因素能够更好地平衡。

Micronaut 对 Leyden 项目的反应

Object Computing, Inc.(OCI)的首席软件工程师 Sergio del Amo Caballero 对 Leyden 项目没有发表 Micronaut 框架的官方声明。但他在最近一个关于在 Micronaut 上添加对 CRaC 支持的GitHub issue上对此进行了阐述。


Caballero 还分享了 2020 年 7 月的一段YouTube视频,视频中 Micronaut 的创始人 Graeme Rocher 对 JPMS 进行了评论:Micronaut 支持 JPMS 并发布了 module-info 文件,但必须要“在支持 Java 8 之间取得平衡”。JPMS 是在 Java 9 中加入的,但 Micronaut 3.5,即当前版本,仍然运行在 Java 8 上。

结论

到目前为止,OpenJDK 还没有解决“Java 启动时间慢、达到性能峰值慢以及占用空间大的问题”。首先,它的jaotc AOT 编译器并没有得到足够的动力,并且已经废弃了。随后,Leyden 项目开始对 Java 的原生编译进行标准化,但停滞了两年之久。


现在,Leyen 项目已经转向首先优化 JIT 编译,情况正在好转:Spring 和 Quarkus 都拥抱 CRaC 以减少启动时间。但是当涉及到实现较小的 Java 应用时,只有 Micronaut 坚持 Leyden 项目的建议,即使用 JPMS。Spring 计划在 2022 年底的 6.0 版本中支持 JPMS,不过 Spring 生态系统可能还不会这样做。而 Quarkus 目前没有计划加入 JPMS。


Leyden 项目的成果,最早可以在 2025 年底以 JEP 的形式到达主流 Java 开发者手中。因此,至少在那之前,将 GraalVM Native Image AOT 编译器与 Quarkus、Micronaut 或即将推出的 Spring Boot 3 等框架结合起来,仍然是避免“Java 启动时间慢、达到性能峰值慢以及占用空间大的问题”的最佳选择。


作者简介:

Karsten Silz 全栈 Java 开发人员,Karsten Silz 在欧洲和美国工作了 23 年。2004 年,他在美国合伙创立了一家提供软件产品的初创公司。Karsten 领导了 13 年的产品开发,并在公司成功出售后离开。自 2017 年以来,他一直在德国和英国做承包商(Spring Boot、Angular、Flutter)。2020 年,他作为 CTO 共同创立了 SaaS 初创公司“Your Home in Good Hands”。


原文链接:

Project Leyden Delays OpenJDK AOT Compiler, Optimizes JIT Compiler Instead

2022-07-13 09:007455

评论

发布
暂无评论
发现更多内容

手把手教你:轻松打造沉浸感十足的动态漫反射全局光照

HMS Core

移动开发 图像 Andriod 引擎

数据火器库八卦系列之瑞士军刀随APP携带的SQLite

sqlite 数据库 科技 玖章算术

SAP 电商云 Spartacus UI 的 checkout 场景中的串行请求设计分析

Jerry Wang

angular 调试 电商 Spartacus 9月月更

基于高效采样算法的时序图神经网络系统(二)

Baihai IDP

人工智能 神经网络 AI 图数据

【数据结构】顺序表(增、删、查、改)的实现 [初阶篇_ 复习专用]

Dream-Y.ocean

c 顺序表 9月月更

版本控制 | 如何有效管理SVN服务器上的多个储存库

龙智—DevSecOps解决方案

svn SVN储存库

拒绝花里胡哨,零基础也能把机器学习给你捣鼓明白

博文视点Broadview

跟我学Python图像处理丨关于图像金字塔的图像向下取样和向上取样

华为云开发者联盟

Python 人工智能 企业号九月金秋榜

漫谈 SAP 产品里页面上的 Checkbox 设计与实现

Jerry Wang

JavaScript 前端开发 web开发 SAP 9月月更

“企业级零代码黑客马拉松大赛”决赛名单公布

明道云

低代码 零代码 企业数字化转型 黑客马拉松

怎么开Scrum五大会议?

敏捷开发

项目管理 Scrum 敏捷

高性能 Java 计算服务的性能调优实战

vivo互联网技术

Java 缓存 性能 JVM 内存

中智车联:用TDengine高效处理车辆运营可视化管理

TDengine

数据库 tdengine 时序数据库 企业号九月金秋榜

GOPS现场 | 对话某科技公司DevOps工程师,从用户角度探讨DevOps工具链

龙智—DevSecOps解决方案

DevOps 运维 DevOps工具

【C语言】动态内存管理 [进阶篇_ 复习专用]

Dream-Y.ocean

c c++ 9月月更

GOPS现场 | 对话龙智大规模安全研发技术专家,分享静态代码、开源组件扫描干货

龙智—DevSecOps解决方案

开源组件 安全研发 静态代码

手把手教大家在 Spring Boot 中处理 flowable 中的用户和组!

江南一点雨

springboot workflow flowable

MobTech ShareSDK 后台配置说明

MobTech袤博科技

开发者 sdk 微信平台 SDK 教程

“3” 生万物,勇敢前行

MIAOYUN

分布式架构下如何选择最佳 Store?

KaiwuDB

数据库 分布式数据库 数据存储

带你掌握如何使用CANN 算子ST测试工具msopst

华为云开发者联盟

人工智能 算子 CANN 企业号九月金秋榜

聊聊Kafka在生产实践中出的一个问题

Java永远的神

kafka 源码 程序人生 中间件 Java 面试

新消费时代,零售业的进与退?

华为云开发者联盟

中台 后端 开发 企业号九月金秋榜

【C语言】深度剖析文件操作 [进阶篇_ 复习专用]

Dream-Y.ocean

c 文件 9月月更

终于大橘已定,分享一波测开面经(美团、小米、华为、阿里等)

Java-fenn

Java 程序员 java面试 Java学习 Java面试题

Qt|QGraphicsView总体架构学习

中国好公民st

c++ qt 9月月更

通用漏洞评分系统 (CVSS)系统入门指南

SEAL安全

漏洞修复 漏洞管理

龙智 | 电话更换通知

龙智—DevSecOps解决方案

微服务低代码Serverless平台(星链)的应用实践

京东科技开发者

Serverless 微服务 云原生 低代码 VMS

【Vue3】穿梭框 -- 思路与实现分析

Sam9029

前端 Vue 3 9月月更

OpenHarmony 3.2 Beta源码分析之MediaLibrary

OpenHarmony开发者

OpenHarmony

Leyden延迟了OpenJDK AOT编译器,转而优化JIT编译器_语言 & 开发_InfoQ精选文章