- 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.2.0
(2020-08-18)
Java
- GraalVM Community Edition 基于 OpenJDK 1.8.0_262 版和 OpenJDK 11.0.8 版。
- Oracle GraalVM Enterprise Edition 基于 Oracle JDK 1.8.0_261 版和 Oracle JDK 11.0.8.0.2 版。您可以在 Oracle Technology Network 网站上找到这些版本的 Oracle JDK 发行说明。(仅适用于 GraalVM Enterprise。)
- 增加了在应用程序进入稳定阶段且编译空闲时,将 libgraal 使用的内存释放到操作系统的能力。这是通过将每个编译器线程附加到一个 libgraal 隔离区实现的。可以附加到隔离区的编译器线程数量由
jvmci.ThreadsPerNativeLibraryRuntime
系统属性控制。默认情况下,所有线程都附加到一个隔离区。隔离区按需初始化以处理额外的编译器线程。当编译器线程空闲时(空闲延迟可通过jvmci.CompilerIdleDelay
配置),它会从其隔离区分离。当最后一个线程从隔离区分离时,隔离区将关闭,其内存(即 libgraal 堆)将释放到操作系统。此功能具有以下优点:- 它可以减少 GraalVM 进程的 RSS 内存占用。如果未使用编译器,则不占用任何资源。
- 如果使用多个隔离区,可以减轻编译器线程之间的干扰。例如,共享对象上的竞争会减少,并且一个隔离区中的垃圾回收不会暂停其他隔离区中的线程。(仅适用于 GraalVM Enterprise。)
- 改进了负责删除冗余读/写、数组
clone()
和对克隆数组操作的访问的优化。大量使用数组读/写操作(尤其是在循环内部)以及分配的工作负载可能会受益于此优化。由于增强的读/写优化,使用 GraalVM JavaScript 引擎在 JetStream 基准测试中看到了高达 2.5 倍的速度提升。(仅适用于 GraalVM Enterprise。) - 添加了一个实验性的部分循环展开优化。部分循环展开是传统 循环展开 优化的扩展形式,适用于循环迭代次数
i
未知的任意计数循环。此优化默认不启用,您可以通过使用-Dgraal.EnterprisePartialUnroll=true
启用它来进行实验。请注意,此优化仍处于实验阶段,因此可能导致未知错误。(仅适用于 GraalVM Enterprise。) - 修复了代码生成中的一个错误,该错误导致使用 Apache commons-compress BZip2 实现的程序行为不正确(参见 #2534)。
- 改进了某些程序的编译时间过长问题(参见 #2548)。
- 改进了 libgraal 的错误报告。libgraal 中的致命错误现在会生成
hs-err
崩溃日志,这可以显著改进此类错误的分类和调试。同样,低级 libgraal 输出,例如由-Dlibgraal.PrintGC=true
生成的 libgraal GC 消息,会路由到 HotSpot 的日志流。也就是说,libgraal 错误处理和日志记录与 HotSpot 对这些功能的支持进行了统一,因此可以通过-XX:LogFile
和-XX:OnError
等选项进行配置。 - 将
MitigateSpeculativeExecutionAttacks
编译器选项重命名为SpectrePHTBarriers
(例如,对于java
使用-Dgraal.SpectrePHTBarriers=AllTargets
,对于js
使用--vm.Dgraal.SpectrePHTBarriers=AllTargets
)。
Native Image
- 改进了 Native Image 需要更短 GC 暂停的工作负载的 G1GC-like 垃圾回收。有关如何启用和配置它的更多详细信息,请参阅文档。(仅适用于 GraalVM Enterprise。)
- 添加了一个选项,用于创建“大部分静态”的本地映像,除了
libc
之外的所有内容都静态链接。以这种方式构建的本地映像在小型 Docker 镜像中很方便使用,例如基于 distroless/static 的镜像。使用以下选项启用近乎静态的本地映像生成:-H:+StaticExecutableWithDynamicLibC
。 - 改进了与
muslc
静态链接的本地映像的生成。如果您的路径中包含musl-gcc
,您现在可以使用以下选项生成与 muslc 静态链接的本地映像:--static --libc=musl
。有关此内容的更多信息,请参见文档。 - 默认启用
-H:+RemoveSaturatedTypeFlows
,这应该会加快本地映像的生成速度并减少生成所需的内存。 - 更改了类初始化策略,以便在构建时仅初始化 JDK 库的一小部分。要恢复之前的行为,请对必要的包使用
--initialize-at-build-time
选项。 - 许多其他改进和错误修复可在存储库中找到。
JavaScript
- 将 Node.js 更新到 12.18.0 版本。此版本中的显著变化可在 Node.JS 项目网站上查阅。
- 将 ICU4J 库更新到 67.1 版本。
- 实现了 Intl.NumberFormat 统一 API 提案。
- 实现了 逻辑赋值运算符 提案。
- 实现了 顶级 Await 提案。
- 实现了 Promise.any 提案。它在 ECMAScript 2021 模式下可用(
--js.ecmascript-version=2021
)。 - 实现了对异步堆栈跟踪的支持。
- 修复了
Date.toLocaleString
和Intl.DateTimeFormat
,使其在未明确请求时区时使用上下文的默认时区,而不是系统默认时区。 - 改进了
js.timezone
选项,以验证时区 ID 并支持“-07:00”之类的时区偏移。
语言和工具实现者的更新
- 默认启用了新的内联启发式算法,其中内联预算基于 Graal IR 节点计数而不是 Truffle 节点计数。更多信息可在内联指南中找到。
- 增加了对
DynamicObject
子类化的支持,以便客户语言可以直接将其对象类层次结构基于此,添加字段并在子类上使用@ExportLibrary
。 - 添加了新的 DynamicObjectLibrary API,用于访问和修改
DynamicObject
实例的属性和形状。更多信息可在动态对象模型指南中找到。 - 向
InteropLibrary
添加了新的身份 APIhasIdentity(Object receiver)
用于查找对象是否指定身份isIdentical(Object receiver, Object other, InteropLibrary otherLib)
用于比较两个对象的身份isIdenticalOrUndefined(Object receiver, Object other)
用于指定对象的身份identityHashCode(Object receiver)
用于实现依赖于身份的映射
- 添加了 Truffle DSL
@Bind
注解,用于在守卫和专门化方法中重用公共表达式。 - 添加了使用
@Cached(value ="...", weak = true)
禁用带有类型节点的 DSL 缓存表达式的采用功能。 - 添加了一个选项,使用
@Cached(value ="...", adopt = false)
不采用由@Cached
注解的参数。 - 添加了
CompilerDirectives.shouldNotReachHere()
作为语言的快捷方式,以指示无论是在编译代码路径还是解释代码路径中,某个路径都不应到达。
更多详细信息可从更新日志中获取。
Polyglot 嵌入器更新
- 添加了
Context.parse(Source)
,用于解析但不安源。解析源代码允许在执行代码之前触发例如语法验证。 - 添加了
PolyglotException.isResourceExhausted()
,用于确定错误是否由超出的资源限制(例如OutOfMemoryError
)引起。 - 添加了一个工厂方法,用于根据主机 Java NIO 创建
FileSystem
。获取的实例可用作装饰文件系统中的委托。 - 添加了可选的
FileSystem.isSameFile
方法,用于测试给定路径是否指向同一个物理文件。该方法可以由FileSystem
实现者使用更高效的测试进行覆盖。
更多详细信息可从更新日志中获取。
工具
VS Code
- 更新了语言服务器协议 (LSP) 实现,以支持最新的协议版本 3.15。
VisualVM
- 将 VisualVM 更新为使用 NetBeans platform 11.3。
- 新增了从 VisualVM 跳转到您首选 IDE 的 GoToSource 功能。
理想图可视化工具
- 改进了 IGV 中图形识别的可用性(IGV 图形现在显示转储 ID 和带有图形名称的用户标签)。(仅适用于 GraalVM Enterprise。)
- 添加了
Go To Type
和Attach Debugger
操作。 - IGV 已更新至 NetBeans platform 11.3。
LLVM 运行时
- 增加了对
InteropLibrary.isIdentical
和相关消息的支持。 - 向
lli
启动器添加了--print-toolchain-api-identifier
、--print-toolchain-api-tool <tool-name>
和--print-toolchain-api-paths <path-name>
参数。这些参数可用于从命令行查询 Toolchain API。 - 增加了通过
#getPaths()
方法向 Toolchain 的 Java API 请求位置的支持。例如,工具链可执行文件或库的位置。 - 添加了
llvm/api/toolchain.h
头文件,用于从 C 代码访问 Toolchain。 - 添加了向 polyglot i8 数组读取和写入更大值的能力。例如,当从一个类型为 i8 数组的外部值读取 i64 时,LLVM 运行时将读取 8 个 i8 值并将它们组合成一个 i64 结果。
- 移除了
--llvm.sourcePath
选项(自 19.0 起已弃用)。请改用--inspect.SourcePath
。 - 移除了对
application/x-llvm-ir-bitcode-base64
MIME 类型(自 19.0 起已弃用)的支持。
Python
- 改进了原生扩展的引用计数,以防止内存泄漏。
- 增加了代码序列化到
.pyc
文件(.pyc
文件持久存储从源.py
文件编译的 Python 字节码)。 - 修复了 pandas 中关于
datetime
对象大小的警告。 - 提高了兼容性(更多 CPython 单元测试通过了核心类型)。
- 增加了对带有参数的请求解析以嵌入 Python 的支持。
- 增加了对
tox
(一个 Python 测试包装器)基本用法的支持。 - 移除了对 polyglot 应用程序中迭代器作为数组的支持。
- 增加了更快的
_struct
实现。(仅适用于 GraalVM Enterprise。)
R
- 改进了使用
--R.UseInternalGridGraphics=false
标志激活的 SVG 支持。 - 改进了 FastR 用户体验:FastR 在 Linux 和 macOS 上应该没有任何要求,即安装 GCC 或 GFortran 运行 FastR 不是必需的,但可能需要安装一些第三方 R 包。
Ruby
新功能
- 更新到 Ruby 2.6.6。
- 配置 Ruby 以始终在回溯中显示核心库文件。
- 现在,当向进程发送 SIGQUIT 时,即使在 TruffleRuby Native 上,也会显示 Java 堆栈跟踪,详见调试。
- 使用
InteropLibrary#toDisplayString()
更好地显示来自其他语言的对象。 foreign_object.to_s
现在使用InteropLibrary#toDisplayString()
(如果isString()
,仍使用asString()
)。foreign_object.inspect
已改进以提供更多有用信息(包括语言和元对象)。foreign_object.name = value
现在将调用Interoplibrary#writeMember("name", value)
,而不是invokeMember("name=", value)
。- 带有块参数的外部对象调用现在会将块作为最后一个参数传递。
foreign.name
现在如果可调用将使用invokeMember
,如果不可调用则使用readMember
。详情请参见doc/contrib/interop_implicit_api.md
。
错误修复
- 修复了
#class_exec
、#module_exec
、#instance_eval
和instance_exec
以使用激活的改进 (@ssnickolay)。 - 安装时使用升级的默认 gem。
- 通过缩短方法名和源名,
--engine.TraceCompilation
的输出现在更容易阅读。 - 修复了带单引号的波浪 heredoc 语法的缩进问题。
- 修复了在顶层打印带有自定义回溯的异常时缺少刷新导致无输出显示的问题。
兼容性
- 通过使用 C 扩展实现了
Ripper
。 - 实现了
ObjectSpace::WeakMap
。 - 支持 Module 的
#refine
(@ssnickolay)。 - 修复了
refine + super
兼容性问题 (@ssnickolay) - 实现了
UnboundMethod#bind_call
。 RUBY_REVISION
现在是用于构建 TruffleRuby 的完整提交哈希,类似于 MRI 2.7+。- 改变了查找方法以实现 Refinements 规范 (@ssnickolay)
性能
- 默认情况下启用了从解析器 AST 到用户代码的 Truffle AST 的惰性翻译。这应该会改善应用程序启动时间。
- 如果未打印(取决于
$VERBOSE
),“实例变量...未初始化”和类似警告现在已优化,以避免对峰值性能产生影响。 - 使用
BigInteger#mod_pow
实现了整数模幂运算 (@skateman)。 - 修复了计算给定非叶子
String
的许多子字符串(包含非 US-ASCII 字符)时的性能问题。 - 加快了 C 扩展的本地句柄到 Ruby 对象的查找速度。
更改
- RubyGems gem 命令默认更新为使用
--no-document
选项。