GraalVM for JDK 23.0.2

(2025-01-21)

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

此版本还包括以下修复:

  • Graal 编译器
    • 修复 Vector API CompareNode 传播了错误的 unorderIsTrue 值的问题。
    • StringBuilder(String) 构造函数的参数上添加显式空检查。
    • AArch64MacroAssembler.add/sub 中,当 immediate = Integer.MIN_VALUE 时出现无限递归。
    • 添加安全点策略更改。
    • 修复源启动器回归。
    • 确保只保留安全点用法。
    • 如果禁用结束安全点,则允许无退出安全点。
  • Native Image
    • 如果后续执行链接后剥离,则保留局部符号。
    • 采用 JDK-8314794:改进 UTF8 字符串支持。
    • 修复 StoreIndexedNode 缺少状态的问题。
    • 使缺少注册警告模式的堆栈跟踪长度可自定义。
    • 改进 Native Image 中 Visual Studio 的检测以及相关的错误消息。
    • 使 PosixPlatformTimeUtils.javaTimeSystemUTC 不可中断。
    • 修复 Native Image 构建期间无效 PGO 配置文件的问题。
  • Truffle 框架
    • 更积极地清除多语言源缓存。
    • 处理 BytecodeOSRMetadata#restoreParentFrame 中的静态帧槽。
    • 修复关于 sandbox.MaxHeapMemory 资源限制的文档。
    • 修复 ObjectSizeCalculator#increaseByArraySize 中的整数溢出。
  • GraalJS
    • 在 JavaScript 独立版中包含 GraalWasm。
    • 修复模块中顶层 for-await-of 的问题。
    • 处理重载运算符与非数值基本类型混合使用的情况。
    • 修复 Polyglot.eval[File] 中缺少返回值转换的问题。
  • GraalWasm
    • 处理 BytecodeOSRMetadata#restoreParentFrame 中的静态帧槽。
  • GraalPy
    • 改进清单文件。
    • 共享引擎不能与 GraalPyResources 一起使用。
    • 修复 GraalPy Gradle 插件在项目不包含任何资源文件时构建失败的问题。
  • Espresso
    • 修复针对生成的类型映射代理的重复类定义尝试。
    • 移除基于数组的静态对象崩溃的解决方法。
  • TruffleRuby
    • 更改模块创建步骤的顺序,并在调用 Module#const_added 回调之前分配模块的全名。

GraalVM for JDK 23.0.1

(2024-10-15)

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

  • 已将 GraalVM Community Edition for JDK 23 更新至 23.0.1+11。请参阅 OpenJDK 23 更新
  • 版本兼容性
    • Truffle 语言和其他组件 24.1.1 版本旨在与 GraalVM for JDK 23.0.1 配合使用。
  • Graal 编译器
    • 在实例化 UnimplementedGraalIntrinsics 时避免使用 getHostBackend
  • Native Image
    • 防止在 reachability-metadata.json 中发出 typeReachable
    • 重置 Provider.Service.constructorCache 字段。
    • 修复了 Windows 上 --bundle-create 选项和 bundle-launcher 功能。
    • 在 AArch64 架构上重置 crb 后移动 setConservativeLabelRange
    • 如果指定了 PGO 配置,则不包含 TruffleJfrFeature
    • 使 ValueConversions 中的缓存急切初始化。
    • 仅当版本信息可从套件中获取时,才将其添加到清单中。
  • Truffle 框架
    • 修复了 Truffle 编译日志中地址部分的对齐问题。
  • JavaScript
    • 使选项 js.webassembly 稳定。
  • GraalWasm
    • 移除了常量内存缓冲区假设并简化了 ByteArrayWasmMemory
  • GraalPy
    • 创建了具有与 GraalPy Maven 插件类似功能的 GraalPy Gradle 插件。
    • 更新了 bouncycastle 依赖项。
    • 已弃用 VirtualFileSystem 中暴露的 Truffle 文件系统 SPI。

适用于 JDK 23 的 GraalVM

(2024-09-17)

平台和分发版

JDK 23 功能可用性

通过传递 --enable-preview 来启用预览功能,以使用其中任何一个。

Graal 编译器

  • 引入了一种新的编译器优化,通过在位移适合一个字节时发出更小的跳转指令,以减小 x64 架构上的代码大小。此优化默认在 Native Image 中启用,在其他地方禁用。使用 -Djdk.graal.OptimizeLongJumps=true 启用。
  • 从 JDK 24 开始,通过 -Dgraal. 前缀指定的 Graal 选项将被弃用并导致弃用警告。

Native Image

新功能

  • 添加了一个新的优化级别 -Os,用于配置优化器以获得最小的代码大小,从而减小文件大小。它启用了 -O2 优化,但排除了那些可能显著增加代码或可执行文件大小的优化。了解更多信息请参阅 Native Image 优化级别
  • typeReachable 条件替换为 typeReachedtypeReached 条件使元数据条目在类型被视为 已到达 时在运行时可用。当该类型(类或接口)或其任何子类型的 类初始化例程 开始之前,类型在运行时被视为已到达。
  • 将 Native Image 可达性元数据配置精简为单个文件 reachability-metadata.json。以前使用的单个元数据文件(例如 reflection-config.jsonresource-config.json 等等)现已弃用,但为了向后兼容性仍将接受。有关更多详细信息,请参阅文档
  • 添加了对 glob 模式的支持,除了 Java 正则表达式之外,还可用于指定资源的路径。Tracing Agent 现在以 glob 格式打印条目。了解更多信息请参阅 在 Native Image 中访问资源
  • 通过添加 proxy 类型的条目,启用了 java.lang.reflect.Proxy 类的反射注册。这允许 Proxy 类的成员在运行时进行反射访问。元数据文件 proxy-config.json 现已弃用,但为了向后兼容性仍将保留。Tracing Agent 已修改为使用新方法。在 reachability-metadata.json 中指定代理类的新格式为:
      {
        "reflection": [
          {
            "type": { "proxy": [ "IA", "IB" ] }
          }
        ]
      }
    
  • 为 Native Image 中的 Proxy 类型添加了稳定名称。名称 $Proxy[id] 被替换为 $Proxy.s[hashCode],其中 hashCode 是使用 Proxy 接口的名称、类加载器的名称以及(如果不是动态模块)模块的名称计算得出的。
  • 在反射和 JNI 配置文件中引入了 type 字段,以支持除了简单名称类型之外的更多类型。
  • 改进了外部函数和内存 API (JEP 454),通过添加对外部函数上调的实验性支持(“巴拿马项目”的一部分)。目前,x64 架构支持外部调用。使用 -H:+ForeignAPISupport 启用。有关更多详细信息,请参阅 Native Image 中的外部函数和内存 API
  • VarHandle/MethodHandle 可以完全内联化时,通过 VarHandleMethodHandle 访问的字段不再被标记为“不安全访问”。这提高了运行时性能。
  • 引入了一个新的 --static-nolibc API 选项,用于构建大部分静态的原生可执行文件。它取代了实验性的 -H:±StaticExecutableWithDynamicLibC 选项。
  • 为 Serial GC 老年代实现了紧凑垃圾回收模式。使用 -H:+CompactingOldGen 选项启用它。主要目的是与复制式 GC 相比,减少内存使用。在 github.com/oracle/graal/pull/8870 了解更多详细信息。这是一项实验性功能。
  • 添加了选项 -H:+GenerateEmbeddedResourcesFile,用于将有关嵌入式资源的信息打印到 embedded-resources.json 中。
  • 添加了对在构建时内存不足时捕获 OutOfMemoryError 异常的支持。
  • 将摘要(例如用于符号名称)从编码为十六进制字符串的 SHA-1(40 字节)更改为作为 Base-62 字符串的 128 位 Murmur3(22 字节)。

已弃用的功能

  • 旧的类初始化策略(在 GraalVM for JDK 22 中已弃用)现已移除。选项 --StrictImageHeap 不再有任何效果。
  • 运行时报告不支持的元素现在默认启用。选项 --report-unsupported-elements-at-runtime 已弃用。

改进

  • 添加了一个检查以确保显式设置的名称(通过 -o name 指定)不会被 -jar jarfile 选项意外覆盖。
  • 添加了一个检查,如果 --static 选项后未跟 --libc=musl,则会导致构建过程失败并报告相应错误。目前,静态链接仅支持 musl
  • 在严格反射配置模式下(当 ThrowMissingRegistrationErrors 启用时),Unsafe.allocateInstance 仅允许对配置中显式注册的类型使用。
  • 当 JNI 查询未包含在可达性元数据中时,Native Image 现在会抛出缺失注册错误。

调试和监控改进

  • 添加了一个新的 API 选项 --emit,用于生成构建报告。它取代了实验性的宿主选项 -H:+BuildReport。可以通过 --emit build-report=custom-build-report.html 来提供报告存储路径,而不是使用旧选项 -H:BuildReportFile=custom-build-report.html。(仅在 Oracle GraalVM 中可用。)
  • 添加了对原生内存跟踪的初步支持。使用 --enable-monitoring=nmt 启用。(与 Red Hat 合作。)
  • 通过添加对事件节流和 ObjectAllocationSample 事件的支持,改进了 JFR 监控体验。还添加了对 OldObjectSample 事件的初步支持。(与 Red Hat 合作。)
  • 现在您可以使用 vswhere 来更可靠地查找 Visual Studio Code 安装以及非标准安装位置。
  • 选项 -XX:MissingRegistrationReportingMode 现在可以在调用时使用,而不是作为构建选项,以避免在调试缺失注册错误时重新构建。

多语言运行时

  • UNTRUSTED 多语言沙盒策略启用了运行时编译函数入口点的随机偏移。GraalVM 还会用随机数量的陷阱指令填充函数的起始偏移量,这有助于防止潜在的 JIT 喷射攻击。
  • 添加了 TruffleLanguage.Env.getScopePublic(LanguageInfo)TruffleLanguage.Env.getScopeInternal(LanguageInfo),以使语言能够直接访问其他语言作用域,从而实现新的多语言内置函数。
  • 添加了 PolyglotException.StackFrame.getBytecodeIndex(),这使得能够访问语言用于标识执行位置的内部字节码索引。

多语言嵌入

  • 添加了系统属性 polyglot.engine.userResourceCache,使嵌入器能够覆盖 HotSpot 上运行的 Java 应用程序的资源缓存目录的默认位置。默认情况下,资源缓存目录位于用户主目录中特定于操作系统的缓存目录内的 org.graalvm.polyglot 目录中。此覆盖的主要原因是为了适应在容器中运行的应用程序,在这些容器中用户的 Home 目录可能不可写。
  • 添加了选项 engine.InterpreterCallStackHeadRoom,以防止在解释器中执行客体方法时发生堆栈溢出。对于 UNTRUSTED 多语言沙盒策略,该选项的值会根据强制选项 sandbox.MaxASTDepth 的值自动计算,选项 sandbox.MaxStackFrames 不再是强制的。新选项仅在 AOT 模式下可用。
  • 添加了对 HotSpot 虚拟线程的实验性支持。目前并非所有语言都支持与虚拟线程一起使用。有关详细信息,请查看语言更新日志。Truffle 调试、CPU 时间限制和一些内存限制目前在虚拟线程上不受支持。每个上下文的线程数目前限制为 65535 个。
  • RuntimeOptions.listDescriptorsgetDescriptor 方法也返回(如果有的话)那些已经可以通过 RuntimeOptions.getset 访问的 Graal 编译器选项。
  • Java 主机互操作不再暴露桥接方法。

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

Espresso

  • Espresso 现在可以使用 TRegex 执行 java.util.regex 模式。TRegex 比标准实现提供更好的性能。使用 java.UseTRegex 启用此引擎。
  • 互操作 ReadBuffer 方法现在可以从客体互操作 API 中使用,并且客体 ByteBuffer 对象实现了此互操作消息。
  • 修复了几个 JDWP 兼容性问题,改进了在使用 Java IDE 调试 Espresso 时的用户体验。
  • 添加了 org.graalvm.continuations 包,以及对 continuations 的支持。有关更多详细信息,请参阅 Espresso Continuations 文档。
  • 添加了 java.RuntimeResourceId,以启用自定义用于定位 Espresso 使用的 Java 标准库的资源。将使用名为 espresso-runtime- 的资源。默认情况下,会尝试 jdk21,然后是 openjdk21

GraalJS

GraalPy

  • GraalPy 现已被视为稳定。尽管许多原生库都能正常工作,但对原生扩展的支持仍处于实验阶段。
  • 已更新至 Python 3.11.7。
  • 将内联的 _pickle 模块实现添加到了基于 GraalVM Community Edition 构建的 GraalPy 中。
  • Polyglot API eval 方法现在在 Python 中评估来自其他语言的代码时会抛出更有意义的异常。来自某种语言的异常直接作为互操作对象(类型为 polyglot.ForeignException)抛出。已移除不指定语言执行 Python 代码的快捷方式。请使用常规的 eval 方法。

GraalWasm

  • GraalWasm 现已被视为稳定。
  • 实现了 SIMD 提案。此功能默认启用,可以使用选项 --wasm.SIMD=false 禁用。
  • 添加了对 clock_res_getfd_advisefd_datasyncfd_fdstat_set_rightsfd_filestat_set_sizefd_preadfd_pwritefd_readdirfd_renumberfd_syncfd_tell 函数的支持。

Truffle 语言和工具实现

  • 已弃用 Node.getCost() 及其关联的 NodeCost 类,没有替代。Truffle DSL 不再自动生成此方法的实现,因此默认情况下始终返回 NodeCost.MONOMORPHIC。这旨在减少二进制文件占用。
  • 改进了调试体验
    • DebuggerSession.suspend(Thread thread) 现在会保留正在进行的步进策略。
    • 添加了 SuspendedEvent.isStep()SuspendedEvent.isUnwind()SuspendedEvent.isBreakpointHit(),以使调试器后端或语言能够查询暂停的原因。
  • 添加了 MathUtils API,提供了对语言实现有用的额外数学函数,例如 asinhacoshatanh
  • 添加了 UnadoptableNode 接口。如果结果是静态已知的,则应优先使用此接口,而不是覆盖 Node.isAdoptable()

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

联系我们