- 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
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。
- 已将 GraalVM Community Edition for JDK 23 更新至 23.0.2+7。请参阅 OpenJDK 23 更新。
- 版本兼容性
- Truffle 语言和其他组件 24.1.2 版本旨在与 GraalVM for JDK 23.0.2 配合使用。
此版本还包括以下修复:
- Graal 编译器
- 修复 Vector API
CompareNode
传播了错误的unorderIsTrue
值的问题。 - 在
StringBuilder(String)
构造函数的参数上添加显式空检查。 - 在
AArch64MacroAssembler.add/sub
中,当immediate = Integer.MIN_VALUE
时出现无限递归。 - 添加安全点策略更改。
- 修复源启动器回归。
- 确保只保留安全点用法。
- 如果禁用结束安全点,则允许无退出安全点。
- 修复 Vector API
- 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
中的缓存急切初始化。 - 仅当版本信息可从套件中获取时,才将其添加到清单中。
- 防止在 reachability-metadata.json 中发出
- Truffle 框架
- 修复了 Truffle 编译日志中地址部分的对齐问题。
- JavaScript
- 使选项
js.webassembly
稳定。
- 使选项
- GraalWasm
- 移除了常量内存缓冲区假设并简化了
ByteArrayWasmMemory
。
- 移除了常量内存缓冲区假设并简化了
- GraalPy
- 创建了具有与 GraalPy Maven 插件类似功能的 GraalPy Gradle 插件。
- 更新了
bouncycastle
依赖项。 - 已弃用
VirtualFileSystem
中暴露的 Truffle 文件系统 SPI。
适用于 JDK 23 的 GraalVM
(2024-09-17)
- 平台和分发版
- JDK 23 功能可用性
- Graal 编译器
- Native Image
- 多语言运行时
- 多语言嵌入
- Espresso
- GraalJS
- GraalPy
- GraalWasm
- Truffle 语言和工具实现
平台和分发版
- 发布了基于 Oracle JDK 23 的 Oracle GraalVM for JDK 23。请参阅 Java SE 23 发行说明。
- 发布了基于 OpenJDK 23 的 GraalVM Community Edition for JDK 23。请参阅 OpenJDK 23 更新。
- 版本兼容性
- GraalVM for JDK 23 兼容于 Truffle 语言和其他组件 24.1.0 版本。
JDK 23 功能可用性
- 455:模式、instanceof 和 switch 中的原始类型(预览)
- 466:类文件 API(第二次预览)
- 467:Markdown 文档注释
- 471:弃用 sun.misc.Unsafe 中的内存访问方法以便移除
- 473:流收集器(第二次预览)
- 476:模块导入声明(预览)
- 477:隐式声明类和实例主方法(第三次预览)
- 480:结构化并发(第三次预览)
- 481:作用域值(第三次预览)
- 482:灵活的构造函数体(第二次预览)
通过传递 --enable-preview
来启用预览功能,以使用其中任何一个。
Graal 编译器
- 引入了一种新的编译器优化,通过在位移适合一个字节时发出更小的跳转指令,以减小 x64 架构上的代码大小。此优化默认在 Native Image 中启用,在其他地方禁用。使用
-Djdk.graal.OptimizeLongJumps=true
启用。 - 从 JDK 24 开始,通过
-Dgraal.
前缀指定的 Graal 选项将被弃用并导致弃用警告。
Native Image
新功能
- 添加了一个新的优化级别
-Os
,用于配置优化器以获得最小的代码大小,从而减小文件大小。它启用了-O2
优化,但排除了那些可能显著增加代码或可执行文件大小的优化。了解更多信息请参阅 Native Image 优化级别。 - 将
typeReachable
条件替换为typeReached
。typeReached
条件使元数据条目在类型被视为 已到达 时在运行时可用。当该类型(类或接口)或其任何子类型的 类初始化例程 开始之前,类型在运行时被视为已到达。 - 将 Native Image 可达性元数据配置精简为单个文件 reachability-metadata.json。以前使用的单个元数据文件(例如 reflection-config.json、resource-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
可以完全内联化时,通过VarHandle
或MethodHandle
访问的字段不再被标记为“不安全访问”。这提高了运行时性能。 - 引入了一个新的
--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.listDescriptors
和getDescriptor
方法也返回(如果有的话)那些已经可以通过RuntimeOptions.get
和set
访问的 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
- JavaScript WebAssembly API 现已成为 GraalJS 的稳定功能,并作为 Oracle GraalVM 的一部分受支持。
- ECMAScript 2024 语言规范默认启用。
- 实现了 使 eval 引入的全局变量可重新声明 提案。
- 实现了 Float16Array 提案。它在 ECMAScript 暂存模式下可用(
--js.ecmascript-version=staging
)。 - 实现了 Array.fromAsync 提案。它在 ECMAScript 暂存模式下可用(
--js.ecmascript-version=staging
)。 - 实现了 可调整大小和可增长的 ArrayBuffer 提案。
- 使选项
js.esm-eval-returns-exports
稳定,并允许在TRUSTED
沙盒策略中使用。
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_get
、fd_advise
、fd_datasync
、fd_fdstat_set_rights
、fd_filestat_set_size
、fd_pread
、fd_pwrite
、fd_readdir
、fd_renumber
、fd_sync
和fd_tell
函数的支持。
Truffle 语言和工具实现
- 已弃用
Node.getCost()
及其关联的NodeCost
类,没有替代。Truffle DSL 不再自动生成此方法的实现,因此默认情况下始终返回NodeCost.MONOMORPHIC
。这旨在减少二进制文件占用。 - 改进了调试体验
DebuggerSession.suspend(Thread thread)
现在会保留正在进行的步进策略。- 添加了
SuspendedEvent.isStep()
、SuspendedEvent.isUnwind()
和SuspendedEvent.isBreakpointHit()
,以使调试器后端或语言能够查询暂停的原因。
- 添加了 MathUtils API,提供了对语言实现有用的额外数学函数,例如
asinh
、acosh
和atanh
。 - 添加了
UnadoptableNode
接口。如果结果是静态已知的,则应优先使用此接口,而不是覆盖Node.isAdoptable()
。
在 Truffle 更新日志 中查找完整的更新列表。