22.3.3

(2023-07-25)

这是 GraalVM 社区版2023年7月关键补丁更新(CPU)。它基于 OpenJDK CPU,包含该 CPU 发布的所有 OpenJDK 安全修复、平台更新以及部分 GraalVM 功能的 Bug 修复。这是一个完整的分发版,取代了 GraalVM 社区版 22.3.2 的先前版本。

  • 构建 GraalVM 社区版所基于的 OpenJDK 版本已更新至
  • 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 版本已更新至
  • 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 版本已更新至
  • Node.js 已更新至 16.18.1 版本。

22.3.0

(2022-10-25)

平台更新

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 版本已更新至
  • 构建 GraalVM 企业版所基于的 Oracle JDK 版本已更新至

Java 和编译器更新

  • 在基于 JDK 19 构建的 GraalVM 中,增加了对 JDK 18 和 JDK 19 功能的支持,例如虚拟线程、简单 Web 服务器、结构化并发等。
  • 通过为每个 libgraal 编译器线程使用一个隔离区,改进了 JIT 编译隔离。这避免了编译器线程之间的所有 GC 干扰,从而减少了编译期间的 GC 暂停。这通常会提高编译速度。在 DaCapo 基准测试中,以每秒字节码数衡量的编译速度至少翻了一番,其中 foppmd 等单个基准测试显示出 3 倍的速度提升。要启用旧模式,请将 -XX:JVMCINativeLibraryThreadFraction=0.66 -XX:JVMCIThreadsPerNativeLibraryRuntime=0 添加到命令行。
  • libgraal 添加了一个专用的 Native Image GC 策略,该策略将积极调整 Eden 空间以最小化 RSS 内存使用。
  • 改进了 jlink 行为,使其生成的镜像使用 Graal 编译器 (libgraal) 作为顶级编译器。从 GraalVM 生成的 jlink 镜像默认使用 JVMCI,并且 java -version 输出带有 GraalVM 品牌标识。
  • 默认启用了 StripMineCountedLoopsEarlyGVN 编译器优化。这些优化首次在 22.2 版本中引入,通过 -Dgraal.StripMineCountedLoops=true-Dgraal.EarlyGVN=true 选项启用。
  • 实现了整数 min/max 操作的循环向量化。此实现处理所有整数大小、手写的 min/max 模式(例如,x > y ? x : y,而不仅仅是 Math.min/Math.max)、无符号 min/max 以及折叠形状的循环(例如,计算数组的最小或最大元素)。
  • libgraaljargraal 中移除了已弃用的 JMX HotSpotGraalRuntime 管理 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 派生的方法名。有关使用 perfvalgrind 的特殊注意事项,请参阅文档
  • 添加了 --enable-monitoring=<all,heapdump,jfr,jvmstat> 选项,以对本地可执行文件中包含的监控功能进行细粒度控制。旧选项 -H:±AllowVMInspection 不应再使用。新选项是受支持 API 的一部分。
  • 为 GraalVM 社区版添加了对 jvmstat 的初始支持。以前,此功能仅在 GraalVM 企业版中可用。
  • 增加了对 JFR 事件 JavaMonitorEnterJavaMonitorWaitThreadSleep 的支持(由 Red Hat 贡献)。
  • 将选项 --enable-sbom 添加到受支持的 API。旧的非 API 选项 -H:IncludeSBOM 不应再使用。

构建输出增强

  • 引入了实验性的 -H:BuildOutputJSONFile=<file.json> 选项,用于以 JSON 格式导出构建输出信息。此外,旧的构建输出样式和 -H:±BuildOutputUseNewStyle 选项已被移除。
  • 添加了 --silent 选项以静默构建输出。

GraalVM Native Image 生态系统更新

JDK 19 支持的已知问题

请注意,java.io.Console API 在 JDK 19 上无法正常工作:Console 是否可用的信息在构建时被错误地计算。这意味着,例如,在没有终端的 CI 系统上构建本地可执行文件时,即使在终端内部运行,该可执行文件也将没有可用的 Console。这也影响了 GraalVM 附带的 Truffle 语言启动器。

项目更新日志可在 GitHub 上查阅。

多语言运行时

  • 引入了 SnippetRun#getException() 方法,该方法提供在代码片段执行期间抛出的 IllegalArgumentExceptionIllegalArgumentException 在返回之前会转换为 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 的启动器,以包含从 pythonpython3graalpy 的符号链接,以便更好地与其他工具集成。

性能改进

  • 默认切换到新的字节码解释器。此更改带来了更好的启动性能和内存占用,同时保持了良好的 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 pandaspip 将选择在 GraalPy 持续集成中测试过的 pandasnumpy 版本。
  • 增加了对 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 添加了以下关键字参数:languageslanguage_optionsinherit_all_accesscode_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_PRCODESET_PRENVSET_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,例如 FrameSlotCompilerOptions 等。请查看 Truffle 项目更新日志以查看完整列表。
  • 添加了 TruffleInstrument.Env#createSystemThreadTruffleLanguage.Env#createSystemThread,用于创建旨在在后台处理工具任务的新线程。
  • 为 Static Frame API 添加了 copyStaticclearStaticswap...Static 等额外方法。
  • 添加了一个检查,用于在启用断言时验证静态帧访问。以与写入时不同的类型读取槽会导致 AssertionError
  • 已弃用 TruffleLanguage.Env.newContextBuilder() 方法,并将其替换为新方法 TruffleLanguage.Env.newInnerContextBuilder(String...)。新方法不再继承父上下文的所有特权,也不再默认初始化创建者上下文。新方法还允许像 Polyglot Embedding API 那样设置内部上下文的允许语言。
  • 更改了设置应用程序参数的行为:内部上下文不再从其外部上下文继承应用程序参数。现在您可以使用 TruffleContext.Builder.arguments(String, String[]) 为内部上下文显式设置应用程序参数。
  • 修改了内部上下文的行为:即使多语言嵌入器为外部上下文使用 Context.Builder.useSystemExit(boolean) 指定了系统退出,内部上下文在退出时也不再使用系统退出
  • 引入了 RootNode.getParentFrameDescriptor 方法,以支持识别热方法的词法作用域父级并更早地编译它们。

完整的更新列表可在更新日志中找到。

联系我们