静态 Java 现状:为提升启动速度、减少空间占用而编译的本地可执行文件

简介: 静态 Java 生成静态编译的本地可执行文件(目标是加快启动速度和减少空间占用),磁盘占用和运行时的元数据开销都减少。InfoQ 采访了 Red Hat 首席软件工程师Dan Heidinga——他是静态 Java 相关工作的长期贡献者——以了解静态 Java 离广泛应用还有多远。

静态 Java 生成静态编译的本地可执行文件(目标是加快启动速度和减少空间占用),磁盘占用和运行时的元数据开销都减少。InfoQ 采访了 Red Hat 首席软件工程师Dan Heidinga——他是静态 Java 相关工作的长期贡献者——以了解静态 Java 离广泛应用还有多远。

参与静态 Java 相关工作是因为他认识到,Java 需要演进,从而满足由云相关的新实践所驱动的不断变化的生态系统。目前,除了参与CRiU(用户空间的检查点/恢复)(包括 OpenJDK 的CRaC项目和 OpenJ9 的CRiU项目),为OpenJ9 JVM、Java Lambdas做贡献,将方法句柄引入 Java,参与Valhalla项目,他在静态 Java 之旅中也走在了前列。

InfoQ:您好,Dan。感谢您抽时间来回答我们读者的多个问题。能否请您简单介绍一下自己,说明下您的日常职责以及您参与静态 Java 相关工作的情况?

Dan Heidinga:长期以来,我既是 JVM 开发者又是 Java 用户。我的日常工作是开发 Hotspot JVM(同时也是 OpenJ9 JVM 的项目负责人)和qbicc项目:一个实验性的 Java 程序静态编译器,可以作为尝试不同静态 Java 方法的游乐场,帮助探索整个设计空间,为 OpenJDK 的 Leyden 项目做准备。

我还积极参与了CRiU(用户空间的检查点/恢复)审查,包括 OpenJDK 的 CRaC 项目和 OpenJ9 的 CRiU 项目,因为我看到,检查点/恢复和静态 Java 的需求存在很多重叠。

InfoQ:静态 Java 有什么优势?最适合什么场景?

Heidinga:静态 Java 生成静态编译的本地可执行文件,旨在加快启动速度,减少空间占用,磁盘占用和运行时的元数据开销都减少。尽管它潜在的应用场景有很多,但微服务、CLI 应用和无服务器部署是最佳候选场景。

它提供以下几项能力:

  1. 应用程序的所有 Java 代码均为本地编译。
  2. 能够“关闭世界”防止其他类被加载。这可以消除死代码,去除不使用的方法和字段,从而使二进制文件更小。
  3. 能够在构建时初始化应用程序的某些部分,以便进一步优化,避免在随后的启动中进行多余的工作。

主要的好处是可以从一个可执行的小部署包快速启动。启动速度加快是因为避免了 Java 的动态行为,如加载和验证类,并在第一次使用时解析每个字段和方法。还有就是利用构建时初始化将操作(如类的初始化)从运行时转移到构建时。

对于堆不大的应用程序来说,运行时空间占用改进最为明显,因为堆大小决定了类元数据所需的内存。

InfoQ:从 Java 经典的“动态虚拟机”模型迁移到静态 Java,对开发者有什么要求?

Heidinga:即使有了指南和工具,开发者也应该有个预期,就是将他们的应用程序转化为静态应用是一项需要花费相当精力的挑战。

静态 Java,顾名思义,比普通 Java 的动态性要低得多。因此,Java 的许多动态特性在使用时都会导致问题,如 Reflection、MethodHandles、类加载、字节码生成和 JVMTI 代理。一个比较好的选择是,从 GraalVM 的跟踪代理入手,创建支持在运行时使用这些动态特性所需的配置文件。静态 Java 的要求之一是限制动态特性,需要在构建时明确选择。

选择一个使用静态 Java 的框架(如 Quarkus、Micronaut)将使你能够利用它所带来的好处,而且可以避免许多采用静态 Java 的障碍。

InfoQ:静态 Java 已经在生产系统中应用了吗?

Heidinga:早期采用者在生产环境中使用了,但主要是在新开项目或非关键用例中使用,这可以帮助建立信心和积累知识。我觉得 OpenJDK Leyden 项目所做的模型标准化会有助于采用。目前为止,对于静态 Java,除了框架使采用路线更加平滑之外,入手还是比较难。

虽然据我估计,随着云端实践在行业中日益广泛,用户对其云部署的成本意识增强,静态 Java 的采用率将继续增长,但会比较缓慢,因为有很多软件将永远无法适应静态 Java 的要求(这也没关系!)。需要静态 Java 特性的用户则刚刚开始意识到这些特性对他们的部署有多重要。

为了真正推动主流的采用,Java 需要意识到当前正在发生的阶段性变化(构建时与运行时,检查点与恢复),为开发者提供工具,让他们可以使用这门语言表达自己的意思。我认为这即将到来,但考虑到现有 OpenJDK 项目的时间跨度,这可能需要一年多的时间。

Heidinga 认为,随着云计算的不断发展,以及人们对缩短启动时间和降低空间占用的需求,静态 Java 的旅程才刚刚开始。但是,Leyden项目的实施可能会加速它的采用。不过现阶段,他建议对其进行实验,并提到 Red Hat 杰出工程师Andrew Dinn所领导的实验。Heidinga 还表示,很难说 Leyden 项目在2020年审批通过后取得了多少进展,但是:

OpenJDK 项目及其周边社区正在进行大量的研究和探索,希望我们在不久的将来可以看到这些工作在 Leyden 项目中得以体现。

有几个项目与 Leyden 项目的问题空间存在重叠,比如 CRaC 项目,特别是关于“如何暴露 Java 编程模型的不同阶段”的问题。另外,GraalVM 社区在这段时间里也在继续改进SubstrateVM。

对于那些在采用静态 Java 时遇到无法解决的问题,或者只是不想调整现有动态设计的人来说,仍然有望提升启动速度:与 CRiU 相关的工作(如 CRaC 项目)旨在探索静态和动态 Java 之间的另一个点。

作者简介:

Olimpiu Pop 是一名软件工程师,具有从财务软件到 IAM 的实时应用开发经验。她热衷于工具和开发流程优化。她担任着欧洲 IDaaS 组织 iWelcome 的工程总监。她是 Transylvania JUG 协调人,Voxxed 罗马尼亚项目委员会成员,并有望在不久的将来成为发言人。同时,她还是 JavaAdventCalendar 的主编。

原文链接:

Static Java Current State: Compiled Native Executables for Startup Speed and Small Footprint

InfoQ
+关注
目录
打赏
0
0
0
0
27
分享
相关文章
|
4月前
|
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
134 9
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
153 2
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
深潜数据海洋:Java文件读写全面解析与实战指南
通过本文的详细解析与实战示例,您可以系统地掌握Java中各种文件读写操作,从基本的读写到高效的NIO操作,再到文件复制、移动和删除。希望这些内容能够帮助您在实际项目中处理文件数据,提高开发效率和代码质量。
37 4
解锁“分享文件”高效密码:探秘 Java 二叉搜索树算法
在信息爆炸的时代,文件分享至关重要。二叉搜索树(BST)以其高效的查找性能,为文件分享优化提供了新路径。本文聚焦Java环境下BST的应用,介绍其基础结构、实现示例及进阶优化。BST通过有序节点快速定位文件,结合自平衡树、多线程和权限管理,大幅提升文件分享效率与安全性。代码示例展示了文件插入与查找的基本操作,适用于大规模并发场景,确保分享过程流畅高效。掌握BST算法,助力文件分享创新发展。
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
FastExcel 是一款基于 Java 的高性能 Excel 处理工具,专注于优化大规模数据处理,提供简洁易用的 API 和流式操作能力,支持从 EasyExcel 无缝迁移。
438 9
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
|
3月前
|
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
138 34
Git使用教程-将idea本地Java等文件配置到gitte上【保姆级教程】
本内容详细介绍了使用Git进行版本控制的全过程,涵盖从本地仓库创建到远程仓库配置,以及最终推送代码至远程仓库的步骤。
67 0
RocketMQ文件刷盘机制深度解析与Java模拟实现
【11月更文挑战第22天】在现代分布式系统中,消息队列(Message Queue, MQ)作为一种重要的中间件,扮演着连接不同服务、实现异步通信和消息解耦的关键角色。Apache RocketMQ作为一款高性能的分布式消息中间件,广泛应用于实时数据流处理、日志流处理等场景。为了保证消息的可靠性,RocketMQ引入了一种称为“刷盘”的机制,将消息从内存写入到磁盘中,确保消息持久化。本文将从底层原理、业务场景、概念、功能点等方面深入解析RocketMQ的文件刷盘机制,并使用Java模拟实现类似的功能。
95 3
Maven clean 提示文件 java.io.IOException
在使用Maven进行项目打包时,遇到了`Failed to delete`错误,尝试手动删除目标文件也失败,提示`java.io.IOException`。经过分析,发现问题是由于`sys-info.log`文件被其他进程占用。解决方法是关闭IDEA和相关Java进程,清理隐藏的Java进程后重新尝试Maven clean操作。最终问题得以解决。总结:遇到此类问题时,可以通过任务管理器清理相关进程或重启电脑来解决。