GraalVM for JDK 24.0.1

(2025-04-15)

这是适用于 JDK 24 的 GraalVM Community Edition 2025 年 4 月 Oracle 关键补丁更新 (CPU)。它基于 OpenJDK CPU,包含该 CPU 发布的所有 OpenJDK 安全修复程序、平台更新以及一些 GraalVM 错误修复。这是一个完整发行版,取代了之前发布的适用于 JDK 24 的 GraalVM Community Edition。

  • 将构建 GraalVM Community Edition 所基于的 OpenJDK 版本更新至 24.0.1+9。请参阅OpenJDK 24 更新
  • 版本兼容性
  • Graal 编译器
    • 移除了 jdk.graal.compiler 的非限定导出。
    • rethrowExceptions 的重置移至创建跳转目标处。
    • 配置了 LibGraalCollectionPolicy 的最大 Eden 大小。
    • AMD64ArrayIndexOfOp: 修复了跨未知对齐的短跳转。
    • EnterpriseReadElimination: 修复了 ObjectClone 的处理。
    • 从节点匹配规则生成浮点 CAS 时,发出额外的重新解释。
  • Native Image
    • 采纳了 JDK-8345266:导入了 JDK 中新的 MonitorEnterWaitOOME 虚拟线程测试。
    • 实现了在 acquireOnOOME 中使用正确的获取计数。
    • AMD64ArrayIndexOfOp: 修复了跨未知对齐的短跳转。
    • 将某些常量加载标记为不可重物化到堆栈。
    • EnterpriseReadElimination: 修复了 ObjectClone 的处理。
    • 从 Maven 生成的 SBOM 中剥离字段,以便仅保留由 Native Image 定义的字段。
    • 防止缺失的哈希码计算跨安全点检查拆分。
    • 确保所有 SBOM 组件都保留 bom-ref 字段。
  • GraalJS
    • 修复了 ImportMetaNode 中的编译失败。
    • 实现了当 WasmInstance 超出作用域时清除 Wasm 内存。
    • js.webassembly 选项设置了 CONSTRAINED 沙盒策略。
    • 使选项 js.text-encoding 稳定,并允许在 SandboxPolicy.CONSTRAINED 中使用。
    • 修复了超属性访问中的 ClassCastException
  • GraalWasm
    • 修复了 WasmFunctionInstance InteropLibrary 中的编译退出。
    • 避免重复读取已实例化 Wasm 模块的代码条目。
    • js.webassembly 选项设置了 CONSTRAINED 沙盒策略。
  • GraalPy
    • PyMuPDF 添加了多项修复。
  • TruffleRuby
    • 更新至 Ruby 3.3.7。
  • TRegex
    • 增加了对主表达式边界之间向后查找合并的多项修复。
  • Truffle 框架
    • 修复了 AMD64CodepointIndexToByteIndexOp 中的越界读取。
    • 修复了布尔装箱消除与短路结合可能导致去优化循环的问题。
    • 修复了 TruffleSafepoint.poll(...) 在不相关线程上执行时,即使线程局部操作在不同线程上执行,也不得失败。
    • 修复了返回类型兼容性检查可能导致 void 特化被过滤的问题。

适用于 JDK 24 的 GraalVM

(2025-03-18)

平台和分发版

特性

Graal 编译器

  • JVMCI 线程的默认数量现在与 C2 线程相同 (-XX:JVMCINativeLibraryThreadFraction=0.66)。这有助于程序预热,但可能会增加最大 RSS。将 -XX:JVMCINativeLibraryThreadFraction 设置为较小的值将导致较小的最大 RSS,但预热时间可能会更长。(请参阅 JDK-8337493。)
  • 首次使用旧版 graal. 前缀时,将显示弃用警告。此警告将在 JDK 26 或更高版本的 GraalVM 中升级为错误。

Native Image

改进和新功能

  • 在此版本中,引入了新一代机器学习驱动的配置文件推断——Graal 神经网络 (GNN) 静态分析器——在广泛的微服务基准测试中观察到峰值性能提高了 7.9%。要启用此优化,请将 -O3 选项传递给 Native Image。此功能仅在 Oracle GraalVM 中可用。在文档中了解更多信息。
  • 引入了 SkipFlow:这是一个 Native Image 静态分析的全新实验性扩展,可在分析过程中动态跟踪原始值并评估分支条件。SkipFlow 可以将二进制文件大小减少多达 4%,而不会对构建时间产生任何额外影响。此功能在 GraalVM for JDK 24 中可用,但默认未启用。使用以下选项启用和测试它:-H:+TrackPrimitiveValues-H:+UsePredicates。此增强是研究合作的成果。请在此处查找论文以了解更多信息。
  • 添加了在运行时运行 Java 代理的 premain 方法的实验性支持。在构建时,使用 -H:PremainClasses 选项指定 premain 类。在运行时,提供 premain 运行时选项以及主类参数,格式为 -XXpremain:<class>:<options>。(请参阅 #8988。)
  • 增强了 Native Image AOT 编译中实验性的 Vector API 支持,现在与 Graal JIT 相媲美。在构建本地映像时启用 Vector API 优化,请使用 --add-modules jdk.incubator.vector-H:+VectorAPISupport 选项。(请参阅 #10285。)改进包括更多优化的 Vector API 操作。在目标硬件支持的情况下,以下操作现在可以高效地编译为 SIMD 代码
    • Vector API 掩码操作
    • 掩码 Vector API 加载和存储
    • 通用 Vector API 重排操作
    • Vector API 对内存段的加载/存储
  • 通过引入针对直接方法句柄的专用上层调用,优化了 Native Image 中的外部函数和内存 API (FFM)
  • 增强了 GraalVM Native Image 中的软件物料清单 (SBOM) 支持,以提高安全性并提供对应用程序依赖项更深入的洞察
    • 类级别元数据包含:您现在可以使用 --enable-sbom=class-level,export 选项将类级别元数据包含到本地映像中的 SBOM 组件中。此信息有助于进行高级漏洞扫描,并更好地理解映像内容。
    • 依赖树生成:SBOM 现在包含从静态分析派生的详细依赖树。此功能提供了本地可执行文件中组件依赖项的分层视图。
    • 提高了 SBOM 的准确性,这对于漏洞扫描至关重要:通过扩展清单文件的解析和处理并与 Native Image Maven 插件集成,GAV 坐标现在更加准确,减少了误报。Shaded 和 Fat JAR 现在得到了更好的处理,以修剪冗余组件并减少漏洞扫描中的误报。

    仅在 Oracle GraalVM 中可用。在文档中了解更多。

  • 通过为反射条目引入 serializable 标志,将序列化 JSON 可达性元数据作为反射元数据的一部分包含在内。
  • 保留包含在本地映像中的资源的来源。默认情况下,此信息包含在构建报告中,也可以通过传递 -H:+GenerateEmbeddedResourcesFile 选项生成。
  • 在 JNI 中添加了对 GetStringUTFLengthAsLong 的支持。(请参阅 JDK-8328877。)
  • 使用 -XX:MissingRegistrationReportingMode=Warn 时,打印堆栈跟踪的长度现在可以通过 -XX:MissingRegistrationWarnContextLines= 设置,默认长度为 8。
  • ActiveProcessorCount 现在需要在隔离区或 VM 创建期间设置。
  • 优化了 ForkJoinPool.commonPool() 构建器方法,以始终遵循 NativeImageOptions.NumberOfThreads 设置的值。
  • 添加了 DuringSetupAccess.registerObjectReachabilityHandler,允许注册一个回调,该回调在堆扫描期间指定类型的对象被标记为可达时执行。

平台兼容性

  • Native Image 现在在 AArch64 上默认以 armv8.1-a 为目标。如果本地可执行文件部署在同一机器或具有相同 CPU 功能的机器上,则在构建时传递 -march=compatibility 以获得最佳兼容性,或传递 -march=native 以获得最佳性能。要列出所有可用的机器类型,请使用 -march=list

  • 添加了对基于 Java 模块系统的服务加载的支持。例如,在 module-info.java 文件中定义以下内容

    module Foo {
        provides MyService with org.example.MyServiceImpl;
    }
    

调试和监控改进

  • 添加了对 Linux 和 macOS 上 jcmd 的实验性支持。使用 --enable-monitoring=jcmd 选项构建启用 jcmd 的本地映像。请参阅文档了解更多信息。
  • 添加了使用基于 GDB Python API 的 Python 辅助脚本 gdb-debughelpers.py 调试本地可执行文件的可能性。请参阅文档了解更多。
  • 将调试信息从 DWARF4 更新到 DWARF5,现在将类型信息存储在 DWARF 类型单元中。切换到 DWARF5 可将调试信息的大小减少 30%。
  • 添加了对发出 Windows x64 展开信息的支持。这使得在调试器和分析器等本地工具中进行堆栈遍历成为可能。

已弃用的功能

  • 从序列化 JSON 元数据中移除了 customTargetConstructorClass 字段。默认情况下,在注册类型进行序列化时,所有可能的构造函数都会被注册。RuntimeSerialization.registerWithTargetConstructorClass 现在已弃用。
  • 首次使用旧版 graal. 前缀时,将显示弃用警告。此警告将在 JDK 26 或更高版本的 GraalVM 中升级为错误。

多语言运行时

  • 将 Graal 语言嵌入到本地映像中时,语言和工具资源现在会自动包含在内。默认情况下,不再在映像旁边创建单独的资源文件夹。在嵌入语言指南中了解更多。
  • 从 GraalVM for JDK 24 开始,用户必须配置对 java 可执行文件的本地访问权限,以避免 JDK 打印警告。对于模块路径用法,请传递 --enable-native-access=org.graalvm.truffle 选项;对于类路径用法,请传递 --enable-native-access=ALL-UNNAMED 选项以解决新警告。请注意,Truffle 会自动将本地访问能力转发给所有已加载的语言和工具,因此无需进一步配置。如果用户使用 --illegal-native-access=deny 拒绝本地访问,则加载优化运行时将失败,并使用回退运行时。更多信息可在默认完整性 JEP 472 中找到。
  • 当不再被强引用时,ContextEngine 现在会自动关闭。可达的 ValuePolyglotException 将保持关联的 Context 可达。此外,当 Context 被显式进入或其中存在活动的 polyglot 线程时,它仍然可达。当存在强可达的 LanguageInstrumentContext 实例时,Engine 仍然可达。但是,仍然建议不要依赖垃圾回收进行关闭。相反,使用 try-with-resources 模式进行显式上下文和引擎管理。更多信息,请参考垃圾回收时自动关闭文档
  • 添加了使用 Value#as(byte[].class) 将访客语言字节缓冲区 (Value#hasBufferElements()) 的内容复制到新字节数组的功能。如果两种方式都可用,新功能优先于将访客对象作为数组 (Value#hasArrayElements()) 访问。
  • 添加了对使用 Value.fromByteBasedString(...)Value.fromNativeString(...) 从原始字节数组和本地内存创建字符串的支持。必须提供 Value.StringEncoding

更新日志中查找完整的更新列表。

GraalJS

项目更新日志中查找完整的更新列表。

GraalPy

新功能

  • 发布了 GraalPy Gradle 插件,用于将 Python 包嵌入到 Java 中
  • 添加了实验性选项 python.IsolateNativeModules,以允许在不同上下文中多次加载本地扩展。请参阅文档了解更多信息。
  • 外部对象现在被赋予一个与其互操作性特性相对应的 Python 类。外部列表现在继承自 Python 的 list,外部字典继承自 dict,外部字符串继承自 str,外部迭代器继承自 iterator,外部异常继承自 BaseException,外部数字继承自 polyglot.ForeignNumber,外部布尔值继承自 polyglot.ForeignBoolean,外部空值继承自 NoneType。这意味着这些类型的所有 Python 方法都可以在相应的外部对象上使用,这些对象的行为尽可能接近 Python 对象。在 Python 代码中调用外部对象上的方法时,Python 方法现在优先于外部成员。还添加了 polyglot.register_interop_type@polyglot.interop_type 来为给定的外部类或类型定义自定义 Python 方法。更多信息请参阅文档

Java 嵌入改进

  • 在 GraalPy 嵌入库 (org.graalvm.python:python-embedding) 中引入了新类型:KeywordArgumentsPositionalArguments,以支持直接从 Java 向 Python 传递关键字和位置参数。
  • 弃用了 org.graalvm.python.embedding.util 包,并向 org.graalvm.python.embedding 添加了新的等效项。
  • Maven 和 Gradle 插件不会将 Python home 嵌入到生成的虚拟文件系统中。相反,任何 Graal 语言(包括 GraalPy)的语言 home 在 GraalVM Native Image 构建中的处理可以通过新的 Native Image 选项 +H:IncludeLanguageResources+H:CopyLanguageResources 进行控制。默认情况下,整个 Python home 会嵌入到本地可执行文件中。在 JVM 部署的情况下,语言 home 嵌入在 Maven Central 上的 GraalPy Artifacts 中。

项目更新日志中查找完整的更新列表。

GraalWasm

  • WebAssembly 模块现在可以通过 import 语句在 JavaScript 中加载。GraalJS 现在支持 WebAssembly/ES 模块集成。在此处阅读更多。
  • 实现了放松 SIMD 提案。此功能可以通过选项 --wasm.RelaxedSIMD 启用。
  • 弃用了 --wasm.AsyncParsingBinarySize--wasm.AsyncParsingStackSize 选项。这些选项不再有任何效果,并将在未来版本中移除。

项目更新日志中查找完整的更新列表。

Espresso

  • Espresso Continuation API 的改进:continuation 暂停现在根据活跃度分析清除槽位。这确保了捕获变量的集合是可预测和确定性的。
  • 添加了对传入主机对象自动使用泛型类型参数的支持,以实现主机和 Espresso 上下文之间更无缝的通信。
  • 当从主机将对象传递到嵌入式 Espresso 上下文时,自定义类型转换器现在始终优先于内置转换器。
  • Espresso 的哈希互操作实现现在在尝试修改不可修改的访客映射时抛出不支持的操作异常。
  • Polyglot.cast() 现在应用自定义类型转换器和接口类型映射,与 Polyglot.castWithGenerics() 相同。
  • 当禁用多线程时,<ProcessReferences> 内置函数不再挂起。

项目更新日志中查找完整的更新列表。

TruffleRuby

  • 更新至 Ruby 3.3.5。
  • Polyglot::ForeignException 现在继承自 StandardError 而不是 Exception
  • 添加了对 OpenSSL 版本 1.1 到 3.4 的支持,优先使用 OpenSSL 3.0.x,其次是 3.x 和 1.1(生命周期结束)。解决了 OpenSSL 3.4 的编译问题。
  • 通过使用 Panama NFI 后端在 JVM 模式下实现更快的上层调用,将 sqlite3trilogyjson 等某些 C 扩展的加速提高了 2 到 3 倍。
  • 优化了 ASCII 兼容编码的编码协商。

TruffleRuby 更新日志中查找完整的更新和错误修复列表。

Truffle 语言实现框架

  • 添加了实验性的字节码 DSL,这是一个用于实现字节码解释器的新框架。字节码 DSL 会根据一组用户指定的操作自动生成一个完整的字节码解释器。生成的解释器定义了字节码解释器的所有必要组件,包括指令集、字节码生成器和优化解释器。字节码 DSL 解释器旨在提高占用空间和解释器速度,优于 AST 解释器,同时不影响峰值性能。字节码 DSL 解释器支持多种功能,包括分层解释、字节码加速、装箱消除、续体和序列化。它们还与现有的 Truffle 工具集成,用于仪器化和调试。请参阅字节码 DSL 简介以开始使用,或查阅用户指南了解更多信息。字节码 DSL 在此版本中是实验性的。
  • Truffle 现在自动为所有语言和工具提供针对JEP 472:准备限制 JNI 使用的 Java 本地访问。
  • 添加了返回主机语言信息的 TruffleLanguage.Env.getHostLanguage() 方法。这允许语言使用 Env.getScopeInternal(LanguageInfo) 查找主机语言的顶级作用域。
  • 添加了 @Bind.DefaultExpression 注解。默认表达式允许您在声明 @Bind 参数时省略显式表达式(使用参数类型的默认表达式)。
  • 添加了 RootNode.findInstrumentableCallNode(...),该方法允许根据调用节点、帧和字节码索引解析仪器化位置。这允许将可仪器化节点存储在字节码解释器的辅助数据结构中。还添加了 TruffleStackTraceElement.getInstrumentableLocation()FrameInstance.getInstrumentableCallNode() 方法来访问已解析的位置。鼓励使用 Truffle 仪器化框架的工具使用这些 API 来访问节点位置。

Truffle 更新日志中查找完整的更新列表。

联系我们