适用于 JDK 22.0.2 的 GraalVM

(2024-07-16)

这是适用于 JDK 22 的 GraalVM 社区版 2024 年 7 月关键补丁更新 (CPU)。它基于 OpenJDK CPU,包含该 CPU 发布的所有 OpenJDK 安全修复、平台更新和一些 GraalVM 错误修复。它是一个完整的分发版,取代了之前发布的适用于 JDK 22 的 GraalVM 社区版。

  • 用于构建 GraalVM 社区版的 OpenJDK 版本已更新至 22.0.2+9。请参阅 OpenJDK 22 更新
  • 版本兼容性
  • Graal 编译器
    • 在更多的浮点概率比较中加入了 epsilon。
    • 修复了 SIMD 重新解释戳记折叠。
    • 改进了 Strip mining 优化,使其不对带有 CaptureStateBegin 后继的循环进行 strip mining。
    • 改进了 Counted strip mining 优化,使其使用正确的内到外状态。
    • 需要溢出才能终止的无符号循环不能被计数。
    • 为掩码负数步长正确实现了 isConstantStride
  • Native Image
    • 修复了 GCHeapSummary JFR 事件中报告的值。
    • 禁用了 FFM API(Project Panama)的失败测试。
    • 改进了引用处理,使其更加健壮,特别是在拆卸过程中防止 OOME。
    • 在低层末尾移除了 OpaqueValueNodes
    • 实现了如果指定了 -H:-ParseRuntimeOptions 则跳过 G1 参数解析。
    • 添加了对物理内存使用和定期原生事件的 JFR 测试的部分支持。
    • 重新计算了图像堆中基于数组的缓冲区对应的 Buffer.address 字段。
    • 添加了测试以验证转换函数。
    • 添加了运行时模块层测试。
    • 移除了 getpwuid,改用 getpwuid_r
    • 修复了构建报告中分解图的数据限制。
    • 添加了一些与 OutOfMemoryError 相关的修复。
    • 修复了 HeapImplMemoryMXBean.getHeapMemoryUsage() 中的一致性问题。
    • deoptStub 中时,使栈指针对齐。
    • 将 CCharPointer 从“char”更改为“signed char”。
  • Truffle 框架
    • 改进了当多语言实现缺失时的错误消息。
    • 禁用了 LoggingTest#testDisableLoggersSingleContext
    • 改进了 ContextPolicyTest#testOptionDescriptorContextReuse 方法,使其更加健壮。
    • 修复了 com.oracle.truffle.polyglot.InternalResourceRoots$Root.path() 由于 this.owningRoot 为空而无法调用的问题。
    • 修复了 SpeculationReason 在 speculate 调用后无法重用的问题。
  • Truffle 上的 Java (Espresso)
    • 修复了 JDWP 方法调用。
    • 修复了外部异常和自定义类型转换器的类型转换器组合。
    • 修复了 JDWP 中步入内部化 Java 方法的问题。
    • 为 Espresso 从互操作性进行方法解析添加了分析。
    • 添加了将外部对象转换为未映射接口的支持。
  • JavaScript
    • 底层 Node.js 已升级到 18.20.2 版本。
    • esm-eval-returns-exports 选项更改为稳定,并可在沙盒模式下使用。
  • 工具
    • 更新了 CPUSampler,使其在采样器已关闭时不再记录中断,并添加了其他各种 CPUSampler 修复。

适用于 JDK 22.0.1 的 GraalVM

(2024-04-16)

这是适用于 JDK 22 的 GraalVM 社区版 2024 年 4 月关键补丁更新 (CPU)。它基于相应的 OpenJDK CPU,包含该 CPU 发布的所有 OpenJDK 安全修复、平台更新和一些错误修复。它是一个完整的分发版,取代了之前发布的适用于 JDK 22 的 GraalVM 社区版。

  • 用于构建 GraalVM 社区版的 OpenJDK 版本已更新至 22.0.1+8。请参阅 OpenJDK 22 更新
  • 版本兼容性
  • Graal 编译器
    • 移除了 SIMD 向量化。
    • 确保将守卫附加到 MoveGuardsUpwards 以遵守 DOM 树。
    • OptimisticAliasingAnalysis 之前运行 OptimisticGuards 作为清理。
    • 修复了始终反优化 FixedGuard 的简化。
    • PiNode.canonical 递归中添加了防止删除的守卫。
  • Native Image
    • 无条件注册虚拟线程组。
    • 更新了 -g 以包含所有用于分析的信息。修复了 objcopy strip 命令的问题。
    • 修复了 IsolateAwareTruffleCompiler.tearDownIsolateOnShutdown 中的死锁。
    • 如果在没有 musl libc 的情况下构建静态可执行文件,则报告错误。
    • 在 SBOutlining 中限制参数数量时考虑栈槽大小。
    • 文档化了 -O-march 和构建工件。
  • Truffle 框架
    • 在运行时编译阶段添加了 InsertGuardFencesPhase
  • Truffle 上的 Java (Espresso)
    • 修复了 JDWP 中当调试器请求局部变量表时出现的 NullPointerException
    • 修复了 Espresso JDWP 中当步进未加载的代码时出现的单步问题。
  • JavaScript
    • 底层 Node.js 已升级到 18.19.1 版本。
    • instanceof 运算符添加了一个检查,以确定左侧是否为外部对象。

适用于 JDK 22 的 GraalVM

(2024-03-19)

平台和分发版

JDK 22 功能可用性

JEP 标题 Graal JIT Native Image
423 G1 区域锁定 JNI 关键区域已启用垃圾回收
447 super(…) 之前的语句 (预览)
454 外部函数与内存 API 🧩 #8113
456 未命名变量和模式
457 类文件 API (预览)
458 启动多文件源代码程序 ℹ️
459 字符串模板 (第二次预览)
460 向量 API (第七个孵化器) 正在进行全面优化 🏗️
461 流收集器 (预览)
462 结构化并发 (第二次预览)
463 隐式声明的类和实例主方法 (第二次预览)
464 作用域值 (第二次预览)
439 分代 ZGC (来自 JDK 21) 🏗️ #8117 ℹ️

✅ 完全可用 🧩 部分可用 🏗️ 暂不可用,正在开发中 ℹ️ 不适用

Java 和编译器

  • Graal 模块已从 jdk.internal.vm.compiler 重命名为 jdk.graal.compiler。同样,编译器包已移至 jdk.graal.compiler 命名空间。此重命名是为了准备 Project Galahad,并为 Graal 子项目建立 jdk.graal 命名空间。请参阅 #7621
  • Graal 选项现在使用 jdk.graal. 前缀,例如 -Djdk.graal.PrintCompilation=true。旧的 graal. 前缀已弃用但仍受支持(例如 -Dgraal.PrintCompilation=true)。
  • 添加了 -Djdk.graal.PrintIntrinsics 以记录当前运行时 Graal 使用的内部函数。

更新日志中查找更多更新。

Native Image

新功能

  • 在 x64 架构上添加了对外部函数与内存 API(“Project Panama”的一部分,JEP 454)的实验性支持。该 API 必须通过 -H:+ForeignAPISupport 显式启用(还需要 -H:+UnlockExperimentalVMOptions)。目前,它包括对外部内存功能和外部函数调用的支持。执行“受限”原生操作的模块必须使用 --enable-native-access 选项指定。请查看Native Image 中的外部函数和内存 API 以获取 FFM API 支持的更详细概述。
  • --strict-image-heap 选项现在默认启用,因此可以从参数列表中删除。它允许所有类在构建时使用,但同时也要求堆中所有对象的类型明确标记为构建时初始化。
  • 添加了对 NATIVE_IMAGE_OPTIONS 环境变量的支持,允许用户和工具通过环境传递额外的参数。与 JAVA_TOOL_OPTIONS 类似,环境变量的值会添加到提供给 native-image 的选项前面。请参阅 GitHub issue #4650

改进

  • 改进了 Native Image 代理跟踪调用机制:代理现在跟踪对 ClassLoader.findSystemClassObjectInputStream.resolveClassBundles.of 的调用,并将资源包注册为包名-区域设置对。
  • 更新了 Native Image 中的 Lambda 类名格式为 CapturingClass$$Lambda/0xstableHash,以与 JDK 名称格式保持一致。
  • 改进了方法句柄的内部化。这尤其提高了 Java 记录的 equalshashCode 方法的性能,这些方法现在使用内部化的方法句柄。
  • Java Object 类、原始类和数组类的方法、字段和构造函数现在默认注册以进行反射。
  • 改进了 Native Image 中缺少元数据的报告,通过抛出特殊异常(实验性)。用户可以及早捕获元数据异常,并使用 -H:ThrowMissingRegistrationErrors=<package-prefix> 选项(或针对所有包使用 -H:ThrowMissingRegistrationErrors)调试相关问题。
  • 改进了 Native Image,使其能够为已注册的反射查询在运行时正确重新抛出构建时链接错误。这可以防止相同的查询返回空结果而不抛出异常。请参阅 GitHub issue #6691
  • System#setSecurityManager 现在默认抛出 java.lang.UnsupportedOperationException,而不是在预期抛出异常的情况下抛出 VM 错误。这可以防止程序执行中止。如果 java.security.manager 属性在程序启动时设置为除 disallow 之外的任何值,此函数将根据 Java 规范抛出 java.lang.SecurityException

调试和监控改进

  • 添加了对以下 JFR 事件的支持:AllocationRequiringGCSystemGCThreadAllocationStatistics。请参阅 GitHub 拉取请求 #7263#7294。(与 Red Hat 合作。)
  • 提供了用于创建线程转储的 API 选项 --enable-monitoring=threaddump。选项 -H:±DumpThreadStacksOnSignal 现已弃用并标记为移除。

已弃用和移除的功能

  • 选项 ParseOnceParseOnceJITInlineBeforeAnalysis 已弃用且不再生效。
  • native-image-agent 中已移除旧版 build 选项。

多语言运行时

  • 移除了对旧版 <language-id>.home 系统属性的支持。将只使用 org.graalvm.language.<language-id>.home

多语言嵌入

  • 添加了使用 Value#as(Collection.class) 将访客语言数组 (Value#hasArrayElements()) 映射到 Java Collection 接口的功能,以便在不复制访客语言数组的情况下访问数组元素。请参阅 GitHub issue #260
  • 实现了在宿主应用程序中将互操作缓冲区映射到 byte[],其中包括:
    • 添加了 Value#readBuffer(long, byte[], int, int) 以实现将缓冲区批量读取到字节数组中。
    • 自定义的 ByteSequence 实现,与 ByteSequence.create(byte[]) 返回的值相同,现在被访客语言解释为缓冲区。
    • 添加了使用 Value#as(ByteSequence.class) 将访客语言字节缓冲区 (Value#hasBufferElements()) 映射到只读 ByteSequence 接口的功能,以便在不复制访客语言缓冲区的情况下访问字节。
  • 弃用了 FileSystems#allowLanguageHomeAccess() 方法,并引入 FileSystem#allowInternalResourceAccess() 作为替代。为确保兼容性,这两种方法现在都支持语言主目录和内部资源。

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

JavaScript 和 Node.js

Truffle 上的 Java (Espresso)

  • 添加了对将从宿主流向嵌入式 Espresso 上下文的常见 JDK 异常类型进行透明转换的支持。
  • 添加了对将宿主原始数组透明转换为 Espresso 原始数组的支持。
  • 添加了通过 互操作协议 调用 Espresso 时对外部 BigInteger 的支持。这还包括采用 fitsInBigIntegerasBigInteger Truffle 互操作消息。
  • 添加了对 Espresso List 对象的 removeArrayElement 互操作消息的支持。
  • 添加了通过 互操作 使用构造函数时,使重载选择与调用方法所支持的功能保持一致。
  • Truffle 上的 Java (Espresso) 现在可以在 JDK 22 宿主上运行。支持的访客 JDK 版本为 8、11、17 和 21。

Python

新功能

  • 改用系统工具链而不是 GraalVM LLVM 运行时 (Sulong)。这减少了默认配置中运行 C 扩展时的占用空间,并且无需预热。
  • 添加了一个新选项 python.InitialLocale 来更改默认区域设置。如果未设置,则使用 Java 的 Locale#getDefault
  • multiprocessing 模块现在默认使用 spawn 方法创建新进程。以前默认的使用线程和多个 Truffle 上下文的方法可以通过 multiprocessing.set_start_method('graalpy') 选择。
  • 我们现在提供了一系列 GitHub Actions 脚本,用于在 GraalPy 上构建流行的原生扩展。这使得 Python 用户能够以可重现的方式,在 GitHub 上使用正确的依赖项构建原生应用程序,并从那里下载工件。请参阅 用于构建 GraalPy wheels 的脚本 以开始使用。
  • 添加了 GraalPy 与 jBang 的集成。您可以使用以下命令试用:
      jbang hello@oracle/graalpython/release/graal-vm/24.0 "print('Hello GraalPy!')"
    

兼容性

  • 已更新到 Python 3.10.13。它内联了从 3.10.8 到 3.10.13 的安全和错误修复。
  • 改进了 Windows 兼容性:增加了对在 Windows 上安装带有原生扩展的包的支持。简单的包,如 ujsonkiwisolver,现在可以在 Visual Studio 命令提示符内的 venv 中安装时正常工作。这意味着用户可以在 Windows 上构建原生应用程序。
  • 在 Python wheels 打包格式的 ABI 标签中包含了 GraalPy C API 修订版本。这避免了在使用快照时意外使用不兼容的二进制文件。
  • 扩展了对以下模块的支持:llvmlitepydantic-corecatboostraytensorflowtensorflow-ioreadme-renderersafetensorskeraspybind11protbufgrpcioPyO3cryptographybcryptcramjamlibcstorjsonrpds_py

互操作性

  • 通过添加 API 来重新定义外部用户定义类型的 Truffle 互操作消息,改进了 polyglot 模块。更多详情请参阅 Truffle 互操作性扩展 API
  • 互操作空值现在被视为相同,而不仅仅是与 Python 的 None 相等。这意味着当 java.type("java.lang.Object[]")(1)[0]None 时,它将返回 True
  • 在嵌入中启用了 allowHostSocketAccess 配置。这意味着套接字现在可以独立于其他 IO 操作而禁用。
  • 外部 BigIntegers 现在受支持,并与所有数值运算符一起工作。

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

Ruby

新功能

  • C/C++ 扩展现在使用系统工具链编译并原生执行,而不是使用 GraalVM LLVM 运行时 (Sulong)。这导致 C/C++ 扩展启动更快、无需预热、更好的兼容性、更小的分发版和更快的安装(#3118)。
  • 通过采用 Prism 解析器,增加了对 Ruby 3.2 和 Ruby 3.3 语法的全面支持(#3117#3039)。
  • 增加了对模式匹配的支持(#3332#2683)。
  • 实现了 Ruby 3.2 的大部分功能(#3039)。

性能

  • 通过按调用点而不是按被调用方决定 ruby2_keywords 转发来优化调用。

此版本中有很多错误修复和兼容性改进,您可以在 TruffleRuby 发行说明中找到。

LLVM

  • 在 macOS 上将 ld64.lld 设置为默认链接器,而不是系统链接器。这解决了 LLVM 工具链包装器和 macOS 平台上的 Xcode 15 的兼容性问题。

Truffle 语言和工具实现

  • Truffle 语言和工具实现现在仅在使用上下文类加载器且在该加载器中找到 Truffle 时加载。如果未设置上下文类加载器或未找到 Truffle,则改用系统类加载器。不委托给系统类加载器的上下文类加载器通常用于实现热重载功能。
  • 添加了 --engine.AssertProbes 选项,该选项断言在 ProbeNode 上,enter 和 return 总是成对调用,并验证包装器节点的正确行为。Java 断言需要打开才能使此选项生效。
  • 在 Truffle DSL 中混合共享和非共享内联节点/配置文件触发内联支持代码中的慢路径时,添加了一个新的性能警告。
  • 添加了系统属性 -Dtruffle.UseFallbackRuntime=true。此属性优于使用 -Dtruffle.TruffleRuntime=com.oracle.truffle.api.impl.DefaultTruffleRuntime
  • 添加了 InteropLibrary#readBuffer(long, byte[], int, int) 以实现将缓冲区批量读取到字节数组中。
  • 在调试器步进逻辑中实现了 onYield()onResume() 检测事件。

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

联系我们