- 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
20.3.6
(2022-04-26)
这是 GraalVM 社区版的 2022 年 4 月关键补丁更新 (CPU)。它基于 OpenJDK CPU,并包含了作为该 CPU 一部分发布的所有 OpenJDK 安全修复。这是一个完整的分发版,取代了 GraalVM 社区版 20.3.5 的上一个版本。
GraalVM 社区版所基于的 OpenJDK 版本已更新至 11.0.15 ,适用于基于 Java 11 的 GraalVM 社区版。请参阅 OpenJDK 11.0.15 更新。
20.3.5
(2022-01-18)
这是 GraalVM 社区版的 2022 年 1 月关键补丁更新 (CPU)。它基于 OpenJDK CPU,并包含了作为该 CPU 一部分发布的所有 OpenJDK 安全修复。这是一个完整的分发版,取代了 GraalVM 社区版 20.3.4 的上一个版本。
GraalVM 社区版所基于的 OpenJDK 版本已更新至 11.0.14 ,适用于基于 Java 11 的 GraalVM 社区版。请参阅 OpenJDK 11.0.14 更新。
20.3.4
(2021-10-19)
这是 GraalVM 社区版的 2021 年 10 月关键补丁更新 (CPU)。它基于 OpenJDK CPU,并包含了作为该 CPU 一部分发布的所有 OpenJDK 安全修复。这是一个完整的分发版,取代了 GraalVM 社区版 20.3.x 的上一个版本。
GraalVM 社区版 20.3.4 已更新至 11.0.13 ,适用于基于 Java 11 的 GraalVM 社区版。请参阅 OpenJDK 11.0.13 更新。
20.3.3
(2021-07-20)
GraalVM 社区版 20.3.3 是一个关键补丁更新 (CPU) 版本。它基于 OpenJDK CPU,并包含了作为该 CPU 一部分发布的所有 OpenJDK 安全修复。这是一个完整的分发版,取代了 GraalVM 社区版 20.3.x 的上一个版本。
它还包括
- 更新至 8u302,适用于基于 Java 8 的 GraalVM 社区版,请参阅 OpenJDK 8u302 更新。
- 更新至 11.0.12,适用于基于 Java 11 的 GraalVM 社区版,请参阅 OpenJDK 11.0.12 更新。
20.3.2
(2021-04-20)
GraalVM 社区版 20.3.2 是一个关键补丁更新 (CPU) 版本。它基于 OpenJDK CPU,并包含了作为该 CPU 一部分发布的所有 OpenJDK 安全修复。这是一个完整的分发版,取代了 GraalVM 社区版 20.3.x 的上一个版本。
它还包括
- 更新至 8u292,适用于基于 Java 8 的 GraalVM 社区版,请参阅 OpenJDK 8u292 更新
- 更新至 11.0.11,适用于基于 Java 11 的 GraalVM 社区版,请参阅 OpenJDK 11.0.11 更新
- Node.js 运行时更新至 12.22.1,包含所有在 2021 年 4 月安全发布中提到的安全修复。
20.3.1.2
(2021-02-11)
这是 GraalVM 20.3.x 分支的一个错误修复版本。它包含对 GraalVM Updater 的操作性更改——这是一个用于安装可选 GraalVM 语言运行时和实用程序,以及更新本地 GraalVM 安装的工具。
- 增强了升级策略,以防止在从 GraalVM 社区版迁移到 GraalVM 企业版 (
gu upgrade --edition ee
) 时出现组件未升级的情况。 - 改进了当用户被提示接受“Oracle GraalVM Enterprise Edition Native Image License”时
gu
对许可证接受的处理。
20.3.1
(2021-01-19)
GraalVM 社区版 20.3.1 是一个关键补丁更新 (CPU) 版本。它基于 OpenJDK CPU,并包含了作为该 CPU 一部分发布的所有 OpenJDK 安全修复。这是一个完整的分发版,取代了 GraalVM 社区版 20.3.0 的上一个版本。
它还包括以下内容
- 更新至 OpenJDK 版本 8u282,适用于基于 Java 8 的 GraalVM 社区版,请参阅 OpenJDK 8u282 更新。
- 更新至 OpenJDK 版本 11.0.10,适用于基于 Java 11 的 GraalVM 社区版,请参阅 OpenJDK 11.0.10 更新。
20.3.0
(2020-11-17)
Java
- GraalVM 社区版基于 OpenJDK 1.8.0_272 和 OpenJDK 11.0.9。
- Oracle GraalVM 企业版基于 Oracle JDK 1.8.0_271 和 Oracle JDK 11.0.9。您可以在 Oracle 技术网络网站上找到这些版本的 Oracle JDK 发布说明。
- 改进了从
libgraal
加载类,现在可以在其初始化之后消除或延迟加载。这提高了在迭代时间非常短(毫秒级)的工作负载上的性能。它还修复了与 VM 假设 JIT 编译器不加载类相关的问题,这些问题可能导致竞争条件,有时甚至是死锁。 - 改进了条件移动优化:GraalVM 企业版包含一项优化,它使用 CPU 的条件移动 (
CMOV
) 指令来实现某些条件语句。在此版本中,我们改进了这项优化,以便为对条件移动指令敏感的工作负载提供更高且更可预测的性能。(仅在 GraalVM 企业版中可用。) - 改进了 GraalVM 企业版中针对循环剥离优化的启发式算法,适用于首次迭代延迟初始化数组对象的工作负载。这是 GraalVM 的 Python 运行时中 Python 迭代器的一个常见模式。它使得微型 Python 基准测试的性能提升高达 40%。(仅在 GraalVM 企业版中可用。)
- 改进了 GraalVM 企业版生成的用于初始化新分配数组的代码,修复了大型数组分配被初始化两次的性能问题。(仅在 GraalVM 企业版中可用。)
- 改进了 GraalVM 企业版中代码重复优化的启发式算法,这使得在某些 LLVM 工作负载上的峰值性能提升高达 17%,在某些 Java 工作负载上提升 5%。(仅在 GraalVM 企业版中可用。)
原生镜像
- 改进了容器感知:在 Linux 上,资源限制——处理器数量、内存大小——从 cgroup
V1
和V2
配置中读取。处理器数量也可以使用命令行选项-XX:ActiveProcessorCount=
进行覆盖。 - 改进了“隔离编译”,它将应用程序和运行时编译器相互分离,通过减少它们之间的干扰(例如由于垃圾回收)来提高性能。
- G1 垃圾收集器现在也支持使用运行时编译代码的本地镜像。它可以在镜像构建时使用选项
--gc=G1
启用。G1 支持目前仅限于 AMD64 架构的 Linux。Windows 和 macOS 支持将在未来的版本中提供。G1 现在还支持性能计数器(当镜像使用-H:+AllowVMInspection
构建时)。(仅在 GraalVM 企业版中可用。) - 改进了启用和禁用断言的选项,现在支持完整的语法来指定包名和类名。断言需要在镜像构建时配置,使用选项
-ea
/-da
/-esa
/-dsa
。“系统断言”的定义已扩展,不仅包括 JDK 中的断言,还包括 Native Image 运行时系统中的断言,例如在垃圾收集器实现中。 - 增加了 Windows 上的基本调试信息生成功能(与红帽合作开发)。
- 增加了许多小的性能和内存占用优化。特别是,新的类型检查实现提高了
Class.isInstance
和Class.isAssignableFrom
的性能,同时在镜像堆中使用了更少的类型数据。 - 增加了对方法句柄的支持,这些方法句柄表示对 Reflection API 可访问的单个方法的调用,且不通过 Method Handles API 应用任何转换,例如对
MethodHandle.bindTo()
或MethodHandle.asType()
的调用。要启用此功能,请使用--report-unsupported-elements-at-runtime
。 - 许多其他错误修复和改进可在 GitHub 仓库中找到。
语言和工具实现者的更新
- 默认启用了编译器线程的弹性分配,根据可用处理器数量,在 JVM 和本地模式下均可。旧行为(1 或 2 个编译器线程)可以使用
--engine.CompilerThreads=0
明确启用。 - 增加了
ThreadsActivationListener
,用于监听工具中的线程进入和离开事件。 - 增加了新标志,用于在部分评估期间检查扩展:
--engine.TraceMethodExpansion=truffleTier
、--engine.TraceNodeExpansion=truffleTier
、--engine.MethodExpansionStatistics=truffleTier
和--engine.NodeExpansionStatistics=truffleTier
。建议语言实现启用这些标志并检查其输出是否存在意外结果。有关详细信息,请参阅 Optimizing.md。 - 增加了
TruffleInstrument.Env.getOptions(TruffleContext)
以检索工具的上下文特定选项,以及TruffleInstrument.getContextOptions()
以描述这些选项。如果工具需要按上下文配置,这会很有用。 - 增加了在语言和工具中创建上下文和上下文线程本地变量的能力。有关详细信息,请参阅
ContextLocal
和ContextThreadLocal
类。 - 增加了
NodeLibrary
,它提供与特定Node
位置相关的客体语言信息,主要是局部作用域,以及TruffleLanguage.getScope
和TruffleInstrument.Env.getScope
,它们提供客体语言的顶级作用域对象。 - 增加了
ByteArraySupport
:一个辅助类,提供从字节数组中安全地访问多字节原始类型的功能。 - 增加了异常的新基类,请参阅
AbstractTruffleException
。原始的TruffleException
已被弃用。增加了用于异常处理的新互操作消息,取代了已弃用的TruffleException
方法。 - 增加了新的专业化工具,用于打印专业化实例和执行计数的详细统计信息。有关如何使用的详细信息,请参阅 专业化统计。
- 更多详细信息可从 变更日志中获取。
Polyglot 嵌入器更新
- 增加了
Context.interrupt(Duration)
以中断多语言Context
执行。中断是非破坏性的,这意味着多语言Context
仍可用于后续执行。 - 增加了为
HostAccess
配置指定目标类型映射的TargetMappingPrecedence
的能力,它影响相对于默认映射和其他目标类型映射的转换顺序和优先级。 - 增加了
log.file
选项,允许将所有语言、工具或引擎日志重定向到文件。使用Context.Builder.logHandler
方法配置的处理程序优先于新选项。 - 增加了基于 Truffle 语言实现框架实现的语言的实验性沙箱资源限制。(仅在 GraalVM 企业版中可用。)
- 更多详细信息可从 变更日志中获取。
JavaScript
- Node.js 已更新至版本 12.18.4。
- 修复了 Nashorn 兼容模式下的字段/getter/setter 访问顺序,请参阅 #343。
- 修复了 Nashorn 兼容模式下的“找到多个适用重载”错误,请参阅 #286。
- 在 Nashorn 兼容模式下,启用了低优先级有损数字、字符串到布尔值以及数字到布尔值的转换。
- 修复了
Java.extend
以遵循HostAccess.Builder.allowImplementations
,请参阅 #294。 - 增加了 Java 主机互操作性支持,用于将 JavaScript 对象映射到抽象类(如果
HostAccess
允许)。 - 增加了
js.foreign-object-prototype
作为受支持的选项,用于为模仿 JavaScript 类型的外部对象设置 JavaScript 原型。它从js.experimental-foreign-object-prototype
重命名而来。 - 更改了
ToPrimitive
抽象操作,使其遵循外部对象的规范。ToPrimitive/ToString
转换不再使用InteropLibrary.toDisplayString
。
Ruby
- 增加了将外部空对象作为虚假值处理的功能 (#1902)。
- 通过禁用 RubyGems 提高了安装后钩子的可靠性 (#2075)。
- 修复了顶级异常处理程序以打印异常原因 (#2013)。
- 修复了
super()
的后置参数处理 (#2111)。 - 修复了词法分析器中非 ASCII 编码的常量/标识符检测 (#2079, #2102)。
- 修复了将
--jvm
作为应用程序参数解析的问题 (#2108)。 - 增加了对
FFI::Pointer
访问的边界检查,当已知其背后内存大小时。 - 为
eval
实现了负行号 (#1482)。 readline
标准库已从 JLine 2 迁移到 JLine 3。- 增加了各种预热改进,显著减少了拆分,并且更多操作以内联方式完成,无需调用。
- 改进了特殊变量
$~
和$_
的设置和访问,它们已重构以减少拆分。 - 更多详细信息可从 变更日志中获取。
R
- 改进了与 ALTREP 框架初步实现的兼容性:http://homepage.stat.uiowa.edu/~luke/talks/uiowa-2018.pdf
- 公开了原生函数
match5
,这是 R 包fastmatch
所必需的。 - 增加了一些较小的兼容性修复,并实现了缺失的 API。
- 更多详细信息可从 变更日志中获取。
Python
- Python 已更新至版本 3.8.5。
- 增加了实验性的新 HPy 原生 API,因此现在可以通过 HPy 运行
piconumpy
。 - 独立的
graalpython
版本现在可以通过pyenv
安装。 - 对标准库类型和模块的单元测试进行了多项修复,包括:
complex
、bytes
、bytearray
、特殊描述符的子类化、类型布局、float
、generators
、modules
、参数传递的边缘情况、字符串字面量和编码、import
和importlib
、decimal
、glob
、builtin
模块、json
、math
、operator
、数字塔、sys
、warnings
、random
、f-strings
、struct
、itertools
、super
。
LLVM 运行时
- 在 GraalVM LLVM 运行时中增加了对代码共享的支持。这使得常见位码库的 AST 和编译代码可以在单个引擎内的多个上下文中共享,从而提高性能。
- LLVM 工具链已更新至版本 10.0.0。
- 改进了跨语言边界的
va_list
/varargs
处理。在从外部语言调用的 LLVM 函数中使用va_start
不再强制所有参数进入原生内存。生成的va_list
对象可以传递给其他语言编写的代码,并使用标准互操作 API 在那里访问。 - 引入了 Handles API,用于在原生内存中存储受管理指针。
- 将
polyglot.h
移动到graalvm/llvm/polyglot.h
,并将llvm/api/toolchain.h
移动到graalvm/llvm/toolchain-api.h
。旧的头文件位置已被弃用,并将在未来版本中移除。 - 将
libpolyglot-mock.so
重命名为libgraalvm-llvm.so
。旧名称已被弃用,并将在未来版本中移除。
工具
Visual Studio Code 扩展
- 增强了 VSCode GraalVM 扩展,增加了
- Java 语法高亮
- Java 代码补全
- 安装向导,可从 UI 下载并安装 GraalVM 社区版或 GraalVM 企业版
- 集成的 Java 调试器,具备您对功能齐全的 IDE 调试器(如 Netbeans IDE)所期望的所有功能
- 集成的多语言调试器,允许调试 Javascript、Python、R、Ruby 和其他 GraalVM 语言
- 实现了一个 VS Code Micronaut 扩展,该扩展
- 利用了 Graal VS Code Java 扩展的所有强大功能
- 包含一个 Micronaut 项目向导,用于创建新的 Micronaut 应用程序
- 包含 Gradle 和 Maven 支持
- 包含使用 GraalVM Native Image 轻松地从 Micronaut Gradle 应用程序创建原生可执行文件的支持
GraalVM 仪表板
- 使用 OracleJET 重新实现了 GraalVM 仪表板。
- 更新了 GraalVM 仪表板,以接受 BGV 中 Native Image 转储文件的新格式。