- GraalVM 发布日历
- 适用于 JDK 24 的 GraalVM
- 适用于 JDK 23 的 GraalVM
- 适用于 JDK 22 的 GraalVM
- 适用于 JDK 21 的 GraalVM
- 适用于 JDK 20 的 GraalVM
- 适用于 JDK 17 的 GraalVM
- GraalVM 22.3.x
- GraalVM 22.2.x
- GraalVM 22.1.x
- GraalVM 22.0.x
- GraalVM 21.3.x
- GraalVM 21.2.x
- GraalVM 21.1.x
- GraalVM 21.0.x
- GraalVM 20.3.x
- GraalVM 20.2.x
- GraalVM 20.1.x
- GraalVM 20.0.x
- GraalVM 19.3.x
22.3.3
(2023-07-25)
这是 GraalVM 社区版2023年7月关键补丁更新(CPU)。它基于 OpenJDK CPU,包含该 CPU 发布的所有 OpenJDK 安全修复、平台更新以及部分 GraalVM 功能的 Bug 修复。这是一个完整的分发版,取代了 GraalVM 社区版 22.3.2 的先前版本。
- 构建 GraalVM 社区版所基于的 OpenJDK 版本已更新至
- 基于 Java 17 的 GraalVM 为 17.0.8+7。请参阅 OpenJDK 17 更新。
- 基于 Java 11 的 GraalVM 为 11.0.20+8。请参阅 OpenJDK 11 更新。
- Graal 编译器:更新了计数条形挖掘优化,以避免对溢出循环进行条形挖掘。
- Native Image:修复了可达性处理程序。
- Native Image:修复了泛型数组签名注册。
- Truffle 框架:修复了默认时区始终与多语言隔离区一起传递的问题。
22.3.2
(2023-04-25)
这是 GraalVM 社区版2023年4月关键补丁更新(CPU)。它基于 OpenJDK CPU,包含该 CPU 发布的所有 OpenJDK 安全修复和平台更新。这是一个完整的分发版,取代了 GraalVM 社区版 22.3.1 的先前版本。
注意:GraalVM 社区版 22.3.2 不支持 JDK 19。随着 Java 20 的发布,JDK 19.0.2(包含在 GraalVM 22.3.2 中)低于安全基线,可能包含未打补丁的漏洞。因此,不应使用它。如果您希望继续使用 GraalVM 22.3.x,应迁移到 JDK 17。这可能需要更改应用程序代码。
- 构建 GraalVM 社区版所基于的 OpenJDK 版本已更新至
- 基于 Java 17 的 GraalVM 为 17.0.7。请参阅 OpenJDK 17 更新。
- 基于 Java 11 的 GraalVM 为 11.0.19。请参阅 OpenJDK 11 更新。
- Node.js 已更新至 16.19.1 版本。
22.3.1
(2022-01-24)
这是 GraalVM 社区版2023年1月关键补丁更新(CPU)。这是一个完整的分发版,取代了 GraalVM 社区版 22.3.0 的先前版本。它基于 OpenJDK CPU,包含该 CPU 发布的所有 OpenJDK 安全修复和平台更新。
- 构建 GraalVM 社区版所基于的 OpenJDK 版本已更新至
- 基于 Java 11 的 GraalVM 为 11.0.18。请参阅 OpenJDK 11 更新。
- 基于 Java 17 的 GraalVM 为 17.0.6。请参阅 OpenJDK 17 更新。
- 基于 Java 19 的 GraalVM 为 19.0.2。请参阅 OpenJDK 19 更新。
- Node.js 已更新至 16.18.1 版本。
22.3.0
(2022-10-25)
- 平台更新
- Java 和编译器更新
- Native Image
- 多语言运行时
- JavaScript 和 Node.js
- Python
- Ruby
- R
- LLVM 运行时
- Truffle 上的 Java
- WebAssembly
- 多语言嵌入
- Truffle 语言和工具实现
平台更新
22.3.0 版本是年度发布列车中的最终特性版本,将在未来12个月内获得 Bug 和漏洞修复支持。21.x 分支的 GraalVM 社区版已终止支持。请查看版本路线图以了解发布计划,并查看新的GraalVM 社区路线图以了解即将推出的功能。
- 发布了实验性的 JDK 19 GraalVM 构建版本,包括 Graal 编译器、Native Image 以及除 Espresso (Java on Truffle) 之外的所有 GraalVM 语言和工具。这些构建版本使用户能够利用最新的 JDK 18 和 JDK 19 功能,例如虚拟线程、简单 Web 服务器、结构化并发等。JDK 19 的支持将在未来版本中提供。详见 #4957 和 #5063。
- 将 GraalVM Native Image 可安装文件的大小减少了约 80MB:LLVM 后端现在作为单独的
native-image-llvm-backend
组件提供(不再默认与native-image
一起提供)。 -
在实验性支持下,发布了适用于 Windows 的 GraalVM 社区版 LLVM 运行时。
- 构建 GraalVM 社区版所基于的 OpenJDK 版本已更新至
- 基于 Java 11 的 GraalVM 社区版为 11.0.17。请参阅 OpenJDK 11.0.16 更新
- 基于 Java 17 的 GraalVM 社区版为 17.0.5。请参阅 OpenJDK 17 更新
- 基于 Java 19 的 GraalVM 社区版为 19.0.1。请参阅 OpenJDK 19 更新
- 构建 GraalVM 企业版所基于的 Oracle JDK 版本已更新至
- 基于 Java 11 的 GraalVM 企业版为 11.0.17。请参阅 Java SE 11 发布说明
- 基于 Java 17 的 GraalVM 企业版为 17.0.5。请参阅 Java SE 17 发布说明
- 基于 Java 19 的 GraalVM 社区版为 19.0.1。请参阅 Java SE 19 发布说明
Java 和编译器更新
- 在基于 JDK 19 构建的 GraalVM 中,增加了对 JDK 18 和 JDK 19 功能的支持,例如虚拟线程、简单 Web 服务器、结构化并发等。
- 通过为每个
libgraal
编译器线程使用一个隔离区,改进了 JIT 编译隔离。这避免了编译器线程之间的所有 GC 干扰,从而减少了编译期间的 GC 暂停。这通常会提高编译速度。在 DaCapo 基准测试中,以每秒字节码数衡量的编译速度至少翻了一番,其中fop
和pmd
等单个基准测试显示出 3 倍的速度提升。要启用旧模式,请将-XX:JVMCINativeLibraryThreadFraction=0.66 -XX:JVMCIThreadsPerNativeLibraryRuntime=0
添加到命令行。 - 为
libgraal
添加了一个专用的 Native Image GC 策略,该策略将积极调整 Eden 空间以最小化 RSS 内存使用。 - 改进了
jlink
行为,使其生成的镜像使用 Graal 编译器 (libgraal
) 作为顶级编译器。从 GraalVM 生成的jlink
镜像默认使用 JVMCI,并且java -version
输出带有 GraalVM 品牌标识。 - 默认启用了
StripMineCountedLoops
和EarlyGVN
编译器优化。这些优化首次在 22.2 版本中引入,通过-Dgraal.StripMineCountedLoops=true
和-Dgraal.EarlyGVN=true
选项启用。 - 实现了整数 min/max 操作的循环向量化。此实现处理所有整数大小、手写的 min/max 模式(例如,
x > y ? x : y
,而不仅仅是Math.min
/Math.max
)、无符号 min/max 以及折叠形状的循环(例如,计算数组的最小或最大元素)。 - 从
libgraal
和jargraal
中移除了已弃用的 JMXHotSpotGraalRuntime
管理 Bean。
Native Image
- 增加了对 JDK 19 和 OpenJDK Project Loom 虚拟线程 (JEP 425) 的支持:Serial GC 和 G1 GC 都支持用于高吞吐量轻量级并发的虚拟线程。由于虚拟线程是 JDK 19 中的预览功能,因此它们也是 GraalVM Native Image 的预览功能。可以通过新选项
--enable-preview
启用它们。基于 JDK 11 和 JDK 17 的 GraalVM 不支持虚拟线程,并且目前也不支持包含 Truffle 语言(JavaScript、Python 等)的本地可执行文件。详见 #4920。 - 识别并添加了 Native Image API 中缺失的部分:应用程序和框架访问
native-image
生成器内部的功能。这包括一个新的公共 API,用于通过编程方式注册 Feature 接口类中的 JNI、Resource、Proxy 和 Serialization 类,并将方法替换的注解移动到 Graal SDK。尽管这些注解不是受支持的 API,但出于实际原因,现在可以在不依赖native-image
生成器的情况下使用它们。对于此版本,native-image
内部仍然发布到 Maven Central,但这将在未来版本中停止。因此,我们鼓励所有用户从本版本开始仅依赖 Graal SDK,如果无法做到,请在 GitHub 上报告更多缺失的 API。 - 将 Native Image 中可用的 G1 GC 版本更新到 JDK 19。此 G1 版本也用于基于 JDK 11 和 JDK 17 的本地可执行文件。此外,G1 GC 现在可以与静态链接到
musl
C 库的本地可执行文件一起使用。 - 添加了
RuntimeResourceAccess#addResource(Module module, String resourcePath, byte[] resource)
API 方法,该方法支持将资源注入到本地可执行文件中。
调试和监控体验改进
- 改进了调试体验,以识别内存使用和内存泄漏(由 Red Hat 贡献)。例如,
perf report
能够将perf
记录会话期间采样的代码地址与 Java 方法关联起来,并在其输出直方图中打印出 DWARF 派生的方法名。有关使用perf
和valgrind
的特殊注意事项,请参阅文档。 - 添加了
--enable-monitoring=<all,heapdump,jfr,jvmstat>
选项,以对本地可执行文件中包含的监控功能进行细粒度控制。旧选项-H:±AllowVMInspection
不应再使用。新选项是受支持 API 的一部分。 - 为 GraalVM 社区版添加了对 jvmstat 的初始支持。以前,此功能仅在 GraalVM 企业版中可用。
- 增加了对 JFR 事件
JavaMonitorEnter
、JavaMonitorWait
和ThreadSleep
的支持(由 Red Hat 贡献)。 - 将选项
--enable-sbom
添加到受支持的 API。旧的非 API 选项-H:IncludeSBOM
不应再使用。
构建输出增强
- 引入了实验性的
-H:BuildOutputJSONFile=<file.json>
选项,用于以 JSON 格式导出构建输出信息。此外,旧的构建输出样式和-H:±BuildOutputUseNewStyle
选项已被移除。 - 添加了
--silent
选项以静默构建输出。
GraalVM Native Image 生态系统更新
- Spring Boot 3.0.0-M5 提供了改进的 AOT 处理和 GraalVM Native Image 支持。
- JUnit 框架 5.9.1 引入了
@EnabledInNativeImage
和@DisabledInNativeImage
注解,使用户能够包含/排除对 GraalVM 本地可执行文件的测试。 - Micronaut 添加了一个新的 测试资源(Test Resources) 功能,并支持 GraalVM Native Image。
- IntelliJ IDEA 2022.2 增加了对调试 GraalVM Native Image 可执行文件的实验性支持。
JDK 19 支持的已知问题
请注意,java.io.Console
API 在 JDK 19 上无法正常工作:Console
是否可用的信息在构建时被错误地计算。这意味着,例如,在没有终端的 CI 系统上构建本地可执行文件时,即使在终端内部运行,该可执行文件也将没有可用的 Console
。这也影响了 GraalVM 附带的 Truffle 语言启动器。
项目更新日志可在 GitHub 上查阅。
多语言运行时
- 引入了
SnippetRun#getException()
方法,该方法提供在代码片段执行期间抛出的IllegalArgumentException
。IllegalArgumentException
在返回之前会转换为PolyglotException
。
完整的更新列表可在更新日志中找到。
JavaScript 和 Node.js
- 实现了 WebAssembly 多值提案,以增加对向 WebAssembly 返回多个值的支持。
- Node.js 已更新至 16.16.0 版本。
- 默认启用了 ECMA-402 国际化 API。可以使用
--js.intl-402=false
选项禁用它。 - 添加了实验性选项
--js.unhandled-rejections=handler
,该选项支持使用自定义回调来跟踪未处理的 Promise 拒绝。 - 实现了 Decorators(阶段 3)提案。
项目更新日志可在 GitHub 上查阅。
Python
- 将整个项目从 GraalPython 重命名为 GraalPy,并将启动器从
graalpython
重命名为graalpy
。此更改还更新了 GraalVM 的启动器,以包含从python
和python3
到graalpy
的符号链接,以便更好地与其他工具集成。
性能改进
- 默认切换到新的字节码解释器。此更改带来了更好的启动性能和内存占用,同时保持了良好的 JIT 编译性能。例如,开发时操作,如
pip install <package>
或在 REPL 中运行import <package>
,现在速度提高了 20-25%,平均内存使用量减少了约 25%。
兼容性改进
- 切换到从 CPython 新的 PEG 语法定义生成的解析器。它带来了更好的兼容性,并使我们能够实现
ast
模块。 - 增加了对 Tracing API (
sys.settrace
) 的支持,这使得pdb
和相关工具可以在 GraalPy 上工作。 - 增加了对 Profiling API (
sys.setprofile
) 的支持,这使得profile
包可以工作。 - 更新了
pip
以自动为已知包选择最佳版本。您可以使用pip install pandas
,pip
将选择在 GraalPy 持续集成中测试过的pandas
和numpy
版本。 - 增加了对 Flask 的支持。
- 实现了 PEP 405,以完全支持虚拟环境。这修复了 PyCharm 或许多项目的持续集成 (CI) 作业中使用的
virtualenv
包和tox
的问题。
完整的更新列表可在更新日志中找到。
Ruby
新功能
- 外部字符串现在拥有 Ruby String 的所有方法。它们被视为
#frozen?
UTF-8 Ruby 字符串。 - 添加了
Java.add_to_classpath
方法,用于在运行时添加 JAR 路径。它允许用户在 JVM 模式 (--jvm
) 下运行时修改 JVM classpath。例如,一个通过 Bundler 管理的 Ruby gem,加载一个 Java 库时可以自行更新 classpath。详见 #2693。 - 增加了对 Ruby 3.1 的 Hash 简写和双关语法,以及匿名块转发语法的支持。
- 为
Polyglot::InnerContext.new
添加了以下关键字参数:languages
、language_options
、inherit_all_access
、code_sharing
。
性能相关改进
- 通过优化更好的主机内联,提高了解释器性能。
- 对于简单的 IO 等待,使用
poll
而不是select
来减少开销 (#1584)。 - 改进了与 Java 的互操作性:在互操作边界不再需要 Java String 和 Ruby String 之间的转换。
兼容性更新
- 增加了对外部字符串的
#dup
和#clone
的支持。 - 实现了
rb_ivar_foreach
,用于像 CRuby 中那样遍历实例和类变量。详见 #2701。
更改
- 移除了
Truffle::Interop.{import_without_conversion,export_without_conversion}
。请改用Polyglot.{import,export}
。 - 移除了
Truffle::Interop.members_without_conversion
。请改用Truffle::Interop.members
。
完整的更改列表可在更新日志中找到。
R
- 实现了全局原生变量 API,以在使用多个 R 上下文时改善 R 图形隔离。用户现在可以同时从两个 R 上下文使用一个原生包。该 API 由多个上行调用组成,名称带有
FASTR_GlobalVar
前缀,例如FASTR_GlobalVarAlloc
。目前,只有 grid 和 graphics 内置包被重构为使用全局原生变量 API。 - 增加了对 dplyr 1.0.3 的部分支持,使用户能够处理内存中和内存外的 DataFrame 等对象。现在已实现了
SET_PRCODE
、SET_PRENV
和SET_PRVALUE
上行调用。
项目更新日志可在 GitHub 上查阅。
LLVM 运行时
- LLVM 工具链已更新至 14.0.6 版本。
- 在实验性支持下,发布了适用于 Windows 的 GraalVM 社区版 LLVM 运行时。
- 改进了对 x86 浮点数扩展精度的支持。现在可以在 x86 架构上使用
long double
参数调用原生函数(例如libc
)。math.h
函数的long double
变体现在使用完整精度。以前它们是使用double
算术实现的。
Truffle 上的 Java (Espresso)
- 添加了多语言自动接口类型映射,用于主机和嵌入式客户机上下文之间的一对一映射。
- 改进了互操作性:当检测到 Espresso-to-Espresso 转换时,会发生 Espresso-to-primitive 转换。后者会失败。
- 现在可以读取 Espresso 对象中的方法,以获得一个新的互操作可执行对象
isExecutable
。 - 修复了主线程中未捕获异常的退出状态。
- 如果
java.UseBindingsLoader=true
,则为 Espresso 绑定(polyglot.getBindings("espresso")
,即类加载的入口点)添加了可调用成员addPath
。它允许向与绑定关联的类加载器添加新路径。这是为了更好地控制 Espresso 在通过 Truffle TCK 时的行为所必需的添加。
项目更新日志可在 GitHub 上查阅。
WebAssembly
- 实现了 多值提案。可以使用选项
--wasm.MultiValue=false
禁用它。 - 默认启用了符号扩展操作(Sign-Extension-Ops)和饱和浮点数到整数转换(Saturating-Float-To-Int)。
项目更新日志可在 GitHub 上查阅。
多语言嵌入
- 实现了 FieldValueTransformer API 作为更通用的机制来拦截和常量折叠字段值(取代了现有
Custom
类型的RecomputeFieldValue
)。如果某个特定字段被标记为转换器并使用BeforeAnalysisAccess#registerFieldValueTransformer
注册,则允许修改其值。转换器必须在静态分析认为字段可达之前注册,并且每个字段只能有一个转换器。在构建时,字段值转换器为镜像堆提供字段的值。如果没有转换器,镜像堆中字段的值与托管的相同。此 API 对于与 Spring 的兼容性是必需的。 - 添加了
Context.Builder.allowInnerContextOptions(boolean)
,它允许上下文生成内部上下文并修改和覆盖语言选项。内部上下文不再与初始上下文共享代码。此特权的默认值根据是否设置了Context.Builder.allowAllPrivilages(boolean)
来确定。在安全敏感的场景中不要启用此特权。 - 将 Native Image 严格内部注解类(
@Alias
、@TargetClass
、@Substitute
等)从com.oracle.svm.core.annotate
移动到org.graalvm.sdk module
。
完整的更改列表可在更新日志中找到。
Truffle 语言和工具实现
- 调整了主机内联启发式算法以减小代码大小。新的主机内联调优指南可在文档中找到。
- 为
TruffleContext
添加了新功能,例如TruffleContext.Builder.forceSharing(Boolean)
以强制或拒绝内部上下文的代码共享,以及许多其他功能。请查看 Truffle 项目更新日志以查看完整列表。 - 移除了几个已弃用的核心 API,例如
FrameSlot
、CompilerOptions
等。请查看 Truffle 项目更新日志以查看完整列表。 - 添加了
TruffleInstrument.Env#createSystemThread
和TruffleLanguage.Env#createSystemThread
,用于创建旨在在后台处理工具任务的新线程。 - 为 Static Frame API 添加了
copyStatic
、clearStatic
和swap...Static
等额外方法。 - 添加了一个检查,用于在启用断言时验证静态帧访问。以与写入时不同的类型读取槽会导致
AssertionError
。 - 已弃用
TruffleLanguage.Env.newContextBuilder()
方法,并将其替换为新方法TruffleLanguage.Env.newInnerContextBuilder(String...)
。新方法不再继承父上下文的所有特权,也不再默认初始化创建者上下文。新方法还允许像 Polyglot Embedding API 那样设置内部上下文的允许语言。 - 更改了设置应用程序参数的行为:内部上下文不再从其外部上下文继承应用程序参数。现在您可以使用
TruffleContext.Builder.arguments(String, String[])
为内部上下文显式设置应用程序参数。 - 修改了内部上下文的行为:即使多语言嵌入器为外部上下文使用
Context.Builder.useSystemExit(boolean)
指定了系统退出,内部上下文在退出时也不再使用系统退出。 - 引入了 RootNode.getParentFrameDescriptor 方法,以支持识别热方法的词法作用域父级并更早地编译它们。
完整的更新列表可在更新日志中找到。