- 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
适用于 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 更新。
- 版本兼容性
- Truffle 语言和其他组件 24.0.2 版设计用于 适用于 JDK 22.0.2 的 GraalVM。
- 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 更新。
- 版本兼容性
- Truffle 语言和其他组件 24.0.1 版设计用于 适用于 JDK 22.0.1 的 GraalVM。
- 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 中当步进未加载的代码时出现的单步问题。
- 修复了 JDWP 中当调试器请求局部变量表时出现的
- JavaScript
- 底层 Node.js 已升级到 18.19.1 版本。
- 向
instanceof
运算符添加了一个检查,以确定左侧是否为外部对象。
适用于 JDK 22 的 GraalVM
(2024-03-19)
- 平台和分发版
- JDK 22 功能可用性
- Java 和编译器
- Native Image
- 多语言运行时
- 多语言嵌入
- JavaScript 和 Node.js
- Truffle 上的 Java
- Python
- Ruby
- LLVM
- Truffle 语言和工具实现
平台和分发版
- 发布了基于 OpenJDK 22 的 适用于 JDK 22 的 GraalVM 社区版。请参阅 OpenJDK 22 更新。
- 发布了基于 Oracle JDK 22 的 适用于 JDK 22 的 Oracle GraalVM。请参阅 Java SE 22 发行说明。
- 版本兼容性
- 适用于 JDK 22 的 GraalVM 与 Truffle 语言和其他组件 24.0.0 版兼容。
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.findSystemClass
、ObjectInputStream.resolveClass
和Bundles.of
的调用,并将资源包注册为包名-区域设置对。 - 更新了 Native Image 中的 Lambda 类名格式为
CapturingClass$$Lambda/0xstableHash
,以与 JDK 名称格式保持一致。 - 改进了方法句柄的内部化。这尤其提高了 Java 记录的
equals
和hashCode
方法的性能,这些方法现在使用内部化的方法句柄。 - 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 事件的支持:
AllocationRequiringGC
、SystemGC
和ThreadAllocationStatistics
。请参阅 GitHub 拉取请求 #7263 和 #7294。(与 Red Hat 合作。) - 提供了用于创建线程转储的 API 选项
--enable-monitoring=threaddump
。选项-H:±DumpThreadStacksOnSignal
现已弃用并标记为移除。
已弃用和移除的功能
- 选项
ParseOnce
、ParseOnceJIT
和InlineBeforeAnalysis
已弃用且不再生效。 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
- Node.js 已更新到 18.18.2 版本。
- 实现了 WebAssembly 线程提议。实现了 Promise.withResolvers 提议。它在 ECMAScript 暂存模式下可用(通过
--js.ecmascript-version=staging
启用)。 - 将 异步迭代器辅助工具提议(从迭代器辅助工具提议中分离出来)的实现移至实验性选项
--js.async-iterator-helpers
之后。 - 实现了 格式良好的 Unicode 字符串提议。它在 ECMAScript 暂存模式下可用(通过
--js.ecmascript-version=staging
启用)。 - 实现了 JSON.parse 源代码文本访问提议。它在 ECMAScript 暂存模式下可用(通过
--js.ecmascript-version=staging
启用)。 - Node.js 中的 WebAssembly 支持已默认启用。可以使用实验性选项
--js.webassembly=false
禁用它。 - 将
--js.import-assertions
选项替换为--js.import-attributes
,因为相应的导入属性提议已从使用断言迁移到使用属性。
Truffle 上的 Java (Espresso)
- 添加了对将从宿主流向嵌入式 Espresso 上下文的常见 JDK 异常类型进行透明转换的支持。
- 添加了对将宿主原始数组透明转换为 Espresso 原始数组的支持。
- 添加了通过 互操作协议 调用 Espresso 时对外部
BigInteger
的支持。这还包括采用fitsInBigInteger
和asBigInteger
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 上安装带有原生扩展的包的支持。简单的包,如
ujson
或kiwisolver
,现在可以在 Visual Studio 命令提示符内的venv
中安装时正常工作。这意味着用户可以在 Windows 上构建原生应用程序。 - 在 Python
wheels
打包格式的 ABI 标签中包含了 GraalPy C API 修订版本。这避免了在使用快照时意外使用不兼容的二进制文件。 - 扩展了对以下模块的支持:
llvmlite
、pydantic-core
、catboost
、ray
、tensorflow
、tensorflow-io
、readme-renderer
、safetensors
、keras
、pybind11
、protbuf
、grpcio
、PyO3
、cryptography
、bcrypt
、cramjam
、libcst
、orjson
、rpds_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 更新日志中查找完整的更新列表。