
主打提前(AOT)原生镜像编译特性的高级JDK发行版GraalVM,自去年起进一步将研发重心拓展到Python、JavaScript等更多非Java语言的适配支持,目前该项目已推出全新的社区功能迭代版本。GraalVM社区版25.1.3正式发布,带来了多项极具实用价值的更新改动。
GraalVM 25.1.3新增了Graal编译器的JIT编译过程录制与回放能力,内置了全新的反汇编工具,同时为不可信代码场景提供了可选的常量混淆防护支持。除此之外,该版本还带来了性能优化、调试能力增强、兼容性提升等改进,Linux平台下的构建产物现在默认生成位置无关可执行文件(PIE),同时配套了其他多项功能升级。面向JavaScript的运行时GraalJS、面向Python的运行时GraalPy等多语言适配组件也同步获得了功能增强。
GraalVM 25.1.3还为原生镜像新增了名为「Web镜像」的实验性后端能力,可直接将Java应用通过提前编译输出为带JavaScript封装层的WebAssembly模块。
本次更新中最让人惊喜的改动,是官方通过进一步压缩冗余数据实现的原生镜像体积瘦身优化:
「我们通过压缩镜像堆元数据与存储结构实现了原生镜像体积缩减,优化范围覆盖模块元数据、运行时动态访问元数据、符号表数据,同时将简单常量场景下的String.format与String::formatted调用直接内置为底层原生逻辑。该优化将Linux AMD64平台下最简HelloWorld示例程序的体积压缩至约6.5MB。」
也就是说,把最基础的”Hello World”示例程序体积压缩到仅6.5MB这件事着实让我吃了一惊——可能是我用其他编程语言太久了,一个仅输出一行文本的最简程序居然要生成6.5MB的可执行文件?我很好奇此前Linux AMD64架构下的同版本HelloWorld程序体积是多少,就特意翻找了相关开发记录。GraalVM的大量核心开发工作是在甲骨文的非公开内部流程中推进的,但这次的代码合并请求下,有开发者公开提出了关于体积优化实际效果的疑问。本次版本新增的原生镜像压缩优化,”理论上能让绝大多数常规程序的镜像体积整体降低1%~2%”,官方开发者随后进一步补充说明:
“整体来看,从25.0.x版本升级到25.1版本后,你会感受到更明显的镜像体积缩减效果,因为我们在该领域落地了多项细碎的小优化(部分优化仍在待合并流程中),多项改进叠加后就能拿到可观的收益。同时由于数据存储结构更紧凑,程序运行时的内存常驻占用(RSS)也能得到小幅正向优化。而你观察到的HelloWorld程序体积大幅跳水,完全是得益于字符串格式化逻辑的底层内置化优化带来的特殊效果。”
但即便如此,把最简HelloWorld程序做到6.5MB这件事,我总觉得哪里不对劲——难道只有我一个人觉得,对于几乎没有任何额外逻辑的极简程序来说,这个体积还是过于臃肿了吗?
GraalVM社区版25.1.3的安装包下载入口和完整更新细节,都可以在项目的GitHub主页上查阅获取。
转自 GraalVM CE 25.1.3 Gets Native Image “Hello World” Program Down To <em>Just</em> 6.5MB – Phoronix
Linuxeden开源社区