OpenJDK 的 Leyden 项目,构建 Java 原生可执行文件的新希望?

提到构建 Java 原生可执行文件,大多数人第一个想到的肯定是 GraalVM。GraalVM 是目前在生产环境中构建原生可执行文件的唯一选择。GraalVM 是 Oracle Lab 的产品,目前有社区版(Community Edition,CE)和企业版(Enterprise Edition,EE)两种。GraalVM CE 是开源免费的,GraalVM EE 则是收费的。

GraalVM logo

与 GraalVM EE 相比,GraalVM CE 所提供的功能比较有限。比如,GraalVM CE 只提供了对 Serial GC 和 Epsilon GC 这两种垃圾回收器的支持。更加高级的 G1 GC 只在GraalVM EE 中提供。有些性能调优工具,也只在 GraalVM EE 中提供。对于想要在生产环境中实际使用 Java 原生可执行文件的公司来说,使用 GraalVM EE 是必须的选择。

对大公司来说,为 GraalVM EE 付费并不是一件很困难的事情。麻烦的是会对 Oracle 公司产生依赖,从而产生不可预知的风险。基于这个原因,OpenJDK 的 Leyden 项目 (https://openjdk.org/projects/leyden/)就诞生了。

Leyden 项目的 logo

Leyden 项目始于2020年,在其开始之后,一直处于隐秘开发状态,并没有对外公开太多信息。在最开始的时候,Leyden 项目的目标是解决长期以来困扰 Java 的3个问题,分别是启动时间慢、到达峰值性能的时间较长、以及内存占用大。Leyden 项目解决这3个问题的做法是引入静态镜像(static images)的概念。

  • 静态镜像是一个独立的程序,从应用中创建而来,仅运行该应用。
  • 静态镜像是一个封闭的世界(closed world)。在运行时不能加载镜像之外的类,也不能动态创建类。

从上述对静态镜像的描述中可以看到,Leyden 项目的最初做法与 GraalVM 是一致的。

在2022年5月的时候,Leyden 项目的优先级发生了变化。这其中最主要的原因是封闭世界的前提对已有的 Java 应用的影响太大,尤其是目前 Java 生态系统中的很多框架和库都严重依赖反射和类加载等机制,导致已有应用很难简单地被编译成原生可执行文件。这也是 GraalVM 在推广时遇到的最大难题。Leyden 项目的新做法是在对已有的应用的限制,以及性能优化上找一个平衡点。也就是说,不再强制要求应用遵循封闭世界的前提,这样虽然会限制对应用所能做的优化,但是可以适用在更多的应用上。Leyden 项目会依赖已有的 OpenJDK 组件,包括 HotSpot JVM,C2 编译器,应用类数据共享(application class-data sharing)和 jlink 工具。虽然 Leyden 项目的长期目标仍然是构建完全的静态镜像,但是短期的目标是让开发人员可以尽早的使用工具来优化应用。

虽然 Leyden 项目的前景很好,但我们仍然需要等待相当长的时间才能使用到它。预计在 2023 年发布的 Java 21 LTS 版本中,可以看到 Leyden 项目的部分内容。而完整的内容,则可能需要等到 2025 年发布的 Java 25 LTS 版本了。

最后总结一下,OpenJDK 的 Leyden 项目的前景不错,因为可以打破 Oracle 的供应商锁定,提供完全开源免费的实现。但是如果要有一个完全可用的 Layden 项目的产品,仍然需要等待很长的时间。

发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章