最新发布《数智时代的AI人才粮仓模型解读白皮书(2024版)》,立即领取! 了解详情
写点什么

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:007443

评论

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

使用 AWS CDK Python 从零开始构建 EKS 集群

郭旭东

AWS IaC AWS CDK

多币种钱包系统开发|多币种钱包软件APP开发

系统开发

图解 | 原来这就是TCP

程序员 网络协议 架构师

拍乐云技术分享 | 美术教学中视频矫正是怎么做的?

拍乐云Pano

音视频 RTC 图像处理 拍乐云 视频处理

老熟人,新朋友!写作平台邀新季!

InfoQ写作社区官方

热门活动

OpsMind 前端低代码开发平台——MPlatform

OpsMind

大前端 低代码

Hbase内核剖析

永健_何

大数据 HBase 底层技术 分布式数据储存

第四周作业

oooh-la

喜讯 | 拍乐云Pano荣获「2020大数据产业创新技术突破」奖

拍乐云Pano

大数据 音视频 RTC 拍乐云

见证产品成长,共享AI力量!

百度大脑

第一章作业

tera

别让假“努力”毁掉了你!面试了10家企业软件测试岗位,面试题整理

程序员阿沐

程序员 面试 软件测试 自动化测试 测试工程师

字节跳动&火山引擎:企业级机器学习平台建设实践

机器学习 云计算 AI 云原生

2020下半年可信边缘云评估结果揭晓,2021年新一轮评估正式开启

浪潮云

大数据 可信云 可信边缘云

焱融科技借公有云出海,服务国际知名卡车制造商自动驾驶业务

焱融科技

自动驾驶 分布式 存储 自动驾驶训练

第一周作业-产品备忘录

Eva

PostgreSQL中Oid和Relfilenode的映射

PostgreSQLChina

数据库 postgresql 开源 软件

Java程序员福音!阿里最新产物分布式小册:存储+计算+通信+资源调度

Java架构追梦

Java 阿里巴巴 架构 面试 分布式

重学JS | Set和Map是如何过滤重复值的?

梁龙先森

面试 大前端 编程语言 28天写作

区块链钱包APP系统开发|区块链钱包软件开发

系统开发

都在用Kafka ! 消息队列序列化怎么处理?

码农架构

Java kafka 架构 消息队列 消息中间件

区块链挖矿到底是什么,该怎么挖?

v16629866266

数据库表数据量大读写缓慢如何优化(3)【Elasticsearch的使用】

我爱娃哈哈😍

大数据 elasticsearch 架构 优化 死磕Elasticsearch

软件架构模式之分层架构

架构精进之路

架构设计 七日更 28天写作

Java 程序经验小结: 慎用可变参数

后台技术汇

28天写作

LocalDateTime、OffsetDateTime、ZonedDateTime互转,这一篇绝对喂饱你

YourBatman

LocalDateTime OffsetDateTime ZonedDateTime

架构师训练营第九周作业

zamkai

PolarDB-X 并行计算框架

PolarDB-X

数据库 sql 大数据

数字货币钱包APP系统开发|数字货币钱包软件开发

系统开发

想学AI开发很简单:只要你会复制粘贴

华为云开发者联盟

GitHub 开源 AI mindspore 推理

谷歌面试题:如何从无序链表中移除重复项?

田维常

面试

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