- 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.1.0
(2020-05-19)
Java
- GraalVM 社区版基于 OpenJDK 1.8.0_252 和 OpenJDK 11.0.7。
- Oracle GraalVM 企业版基于 Oracle JDK 1.8.0_251 和 Oracle JDK 11.0.7。您可以在 Oracle 技术网络网站上找到这些版本的 Oracle JDK 发行说明。
- 增加了对编译字节码中含有不可约循环的类的支持。这些循环常出现在使用协程的 Kotlin 应用程序中。此支持既提高了此类应用程序的性能,又使其能够进行提前编译。
- 新增了
TuneInlinerExploration
选项,用于增加或减少探索内联机会所花费的时间。调整此选项有助于实现更好的峰值性能,或者限制达到(可能更低)峰值性能所需的时间,这可能会提高程序的整体速度。此选项仅为启发式方法,应针对特定应用程序进行调整。(仅在 GraalVM 企业版中可用。) - 增加了对优化一些冗余克隆操作的支持。例如,在与以下代码模式相似的代码中,GraalVM 编译器将避免创建数组克隆:
new int[length].clone().length
-
增加了在 VisualVM 中可视化 libgraal 内存使用情况的支持:
- 英特尔跳跃条件代码 (JCC) 错误缓解措施 现在仅针对需要它的 CPU 启用。
- 由于同步区域的修复,JDK 11 上某些基准测试的性能显著提高。最显著的改进是 Renaissance:reactors,其结果提高了约 50%。
Native Image
- 改进了静态分析的可伸缩性。对于某些大型应用程序,静态分析时间不可行。我们添加了一种新机制,称为“饱和类型流”,以加快分析速度。新分析在 GraalVM 20.1 中默认禁用,但我们计划在未来版本中默认启用它。我们鼓励所有用户使用图像构建器选项
-H:+RemoveSaturatedTypeFlows
尝试使用它。根据我们的测量,静态分析的精度是可比的,但如果您的应用程序在此选项下可达的类或方法更多,请在 GitHub 上创建问题。 - 为图像生成器新增了一个选项,用于在终止信号时退出处理程序:
--install-exit-handlers
。这改善了在 Docker 容器中作为 init 进程运行原生镜像的用户体验,因为 Linux 不会为进程 ID 为“1”的进程安装默认信号处理程序,因此原生镜像不会响应 Docker 的关机请求。 - 改进了对软引用的支持。在 20.1 之前,软引用(Java
SoftReference
类)在每次 GC 时都会像弱引用一样立即清除。现在,它们根据考虑上次访问和内存压力的策略进行清除。 - GC 中新增了幸存区。在适当的策略实现之前,默认禁用此功能,有关原生镜像中 GC 的想法和任务,请参阅此 GitHub 问题。
- 新增了 Dwarf 调试信息的生成。
- 改进了时区支持:现在每个镜像都包含所有时区信息,并且默认时区在镜像启动时正确初始化,不再在镜像生成时固定。
- 改进了对原生编译器工具链正确性的检查,例如,Windows 上的编译器版本是否正确。这避免了由于已知不兼容的编译器版本导致的奇怪错误。
更多兼容性改进和错误修复可在 GitHub 上找到。例如,这里是与 Spring 框架支持相关的已修复问题列表。
JavaScript
- 默认启用了 ECMAScript 2020 模式功能。
- 实现了多项 ECMAScript 提案,包括可选链、Hashbang 语法、FinalizationRegistry、私有类方法、RegExp 匹配索引、
export * as ns from "mod"
、Intl.Locale、Intl.DisplayNames、Intl.DateTimeFormat 的 dateStyle 和 timeStyle。 - 在 GraalVM 发行版中添加了
npx
(npm 包运行器)实用程序。 - 删除了 JOni RegExp-engine 和
use-tregex
选项。TRegex 引擎现在是默认的正则表达式引擎。 - 删除了我们的
SIMD.js
实现。
LLVM 运行时
- 增加了在托管模式下运行 C++ 代码的初步支持。(仅在 GraalVM 企业版中可用。)
- 将 musl libc 更新到版本 1.1.24。(仅在 GraalVM 企业版中可用。)
libc++
和libc++abi
现在都作为位码库提供。- 改进了 C++ 支持,只有当
libc++
加载时才加载libsulong++
。使用工具链编译的可执行文件 (ELF, Mach-O) 通常依赖于此库并将继续工作。纯位码文件(不允许指定依赖项)可能会失败并出现类似以下内容的错误Global variable ZNSt3_15ctypeIcE2idE is declared but not defined.
例如,在 Linux 上可以通过在命令行
lli --lib libc++.so.1 ...
或在 macOS 上通过lli --lib libc++.1.dylib
指定依赖项来解决此问题。 - 更改了模块初始化顺序,使其仅基于 ELF/Mach-O 文件中记录的依赖项(而不是查看导入的符号)。这可能会改变纯位码文件的初始化顺序,因为它们不允许记录依赖项。如果初始化顺序很重要,建议的方法是使用 ELF/Mach-O 文件。有关更多详细信息,请参阅工具链文档。
- 增加了在位码执行期间对循环进行栈上替换的支持,现在它可以在周围函数编译之前编译长时间运行的循环。
Python
- 更新到 Python 3.8.2。
- 改进了带有原始元素的元组的性能。
- 改进了序列、集合、字典和列表表达式的性能。
- 分别通过 GraalVM CPU 采样器和覆盖率增加了对
cProfile
和trace
模块的支持。 - 增加了对 macOS 上 NumPy 的支持。
- 增加了对
setuptools-scm
和pytz.timezone
的支持。 - 增加了对从 yield 和 return 语句中可迭代解包的新语法的支持。
- 修复了 Chrome 调试器中非 Python 数字的检查和打印问题。
- 修复了当这些上下文在多个线程上并发运行时,不同上下文之间 AST 共享的问题。
- 修复了向
gethostbyname
传递非 ASCII 字符串的问题。 - 改进了 Jython 兼容模式:当与
is
运算符比较时,将 Javanull
视为与 PythonNone
相同。 - 改进了 Jython 兼容模式:
isinstance
现在适用于 Java 类和对象。 - 将所有 GraalPython 特定函数从
sys
或builtins
移至_graalpython_
模块。
要查看完整的更改列表,请参阅项目变更日志。
R
- 基于
graphics
、grDevices
和JavaGD
包的改进图形支持预览- 使用
--R.UseInternalGridGraphics=false
激活此功能。 - 我们自定义的 grid 包重新实现,目前是默认设置,将在未来版本中首先弃用,然后删除。
- 使用
- 包含了受支持系统(Linux 和 macOS)的 GCC 运行时库
- 移除了 GFortran 作为运行 FastR 的要求。
- GFortran 运行时库版本在 Linux 上是 4.8.5,在 macOS 上是 8.3.0。编译包含 Fortran 代码的其他 R 包时,必须使用相同或更高版本的 GFortran。
- 存在一个已知问题:libgomp.1.dylib 库未随 MacOS 上的 FastR 一起分发。要解决此问题:使用您选择的包管理器安装 GCC,例如
brew install gcc
找到文件libgomp.1.dylib
。变量$GOMPLIB
将表示此库的完整路径,$R_HOME
表示 R 安装路径:在基于 JDK8 的构建上是$JAVA_HOME/jre/languages/R
,在基于 JDK11 的构建上是$JAVA_HOME/languages/R
。执行这两个命令:install_name_tool -change /cm/shared/apps/gcc/8.3.0/lib/libgomp.1.dylib $GOMPLIB $R_HOME/lib/libRblas.dylib
install_name_tool -change /cm/shared/apps/gcc/8.3.0/lib/libgomp.1.dylib $GOMPLIB $R_HOME/lib/libRlapack.dylib
- 存在一个已知问题:libgomp.1.dylib 库未随 MacOS 上的 FastR 一起分发。要解决此问题:使用您选择的包管理器安装 GCC,例如
- GFortran 现在是默认的 Fortran 编译器,即使在 LLVM 工具链配置中也是如此。
- 增加了对
traceback()
的支持,以便在 LLVM 模式(--R.BackEnd=llvm
)下运行时显示来自其他 GraalVM 语言和 C/C++ 的帧。 - 改进了与其他语言的互操作性:“@”和“$”可用于访问外部多语言对象的成员。
可在项目变更日志中找到更改和错误修复的详细列表。
Ruby
- 增加了夜间构建,详情请参阅 README。
- 如果右侧表达式只执行一次,
||=
将不会编译它,以匹配惯用的延迟初始化用例(请参阅博客文章)。 - 优化了
bundle install
的性能。 - 新增了
--metrics-profile-require
选项,用于分析文件搜索、解析、翻译和加载。 - 将 C API 类型
VALUE
定义为unsigned long
,与 MRI 相同。这使得可以使用switch (VALUE)
和其他依赖于VALUE
为整数类型的表达式。 - 移除了已弃用的
Truffle::System.full_memory_barrier
、Truffle::Primitive.logical_processors
和Truffle::AtomicReference
。 - 改进了与其他语言的互操作性:哈希键不再报告为多语言成员。
- 增加了
Truffle::Interop.hash_keys_as_members
以将 Ruby Hash 视为一个多语言对象,其中哈希键作为成员。
其他 56 个错误修复和 52 个兼容性改进,详情请参阅变更日志。
工具
Chrome 检查器
- 实现了在调试器、Chrome Inspector 和异常跟踪中显示异步堆栈跟踪。
语言服务器协议
- 提高了 GraalVM 语言服务器和 GraalVM VSCode 扩展的稳定性。
- 改为以原生模式启动 GraalVM 语言服务器,以获得更好的启动性能。
- 稳定了 R 和 Ruby 中 LSP 的支持。
VisualVM
- 启用了 VisualVM 监视 libgraal 内存使用情况。
- 实现了在 GraalVM 采样器中显示编译时间和解释器时间。
- 改进了 JFR 查看器,以显示 JFR 事件的堆栈跟踪。
理想图可视化工具
-
增加了按会话分组的图表转储:
- 新增了转到编译器类的操作。
- 提高了 IGV 的稳定性,使其不再在某些图布局上挂起。
GraalVM 更新器 gu
- 增加了当 GraalVM Updater 从目录安装时(
-C
)对通配符的支持。
Polyglot 嵌入器更新
- 增加了
Value.isMetaObject()
、Value.getMetaQualifiedName()
、Value.getMetaSimpleName()
和Value.isMetaInstance(Object)
,以允许与语言无关地访问元对象,如类或类型。 Value.getMetaObject()
的结果将始终返回元对象。建议但不强制将元对象的使用更改为使用Value.getMetaQualifiedName()
而不是Value.toString()
来返回类型名称。- 增加了 OptionDescriptor.getDeprecationMessage 返回选项弃用原因。增加了 OptionDescriptor.Builder.deprecationMessage() 以设置选项弃用原因。
- 增加了 Context.Builder.hostClassLoader,允许嵌入器为代码执行指定上下文
ClassLoader
。
更多更改可在 GraalVM SDK 变更日志中找到。
语言和工具实现者的更新
engine.Mode
现在是一个受支持的选项,不再是实验性的。- 向
InteropLibrary
添加了新的元数据 APIhas/getLanguage(Object receiver)
用于访问对象的原始语言has/getSourceLocation(Object receiver)
用于访问对象的源位置(例如,函数或类)has/toDisplayString(Object receiver, boolean allowsSideEffect)
用于生成人类可读的字符串has/getMetaObject(Object receiver)
用于访问对象的元对象isMetaObject(Object receiver)
用于判断对象是否是元对象(例如,Java 类)getMetaQualifiedName(Object receiver)
用于获取元对象的限定名getMetaSimpleName(Object receiver)
用于获取元对象的简单名称isMetaInstance(Object receiver, Object instance)
用于检查对象是否是元对象的实例
- 增加了
TruffleLanguage.getLanguageView
,允许包装值以添加原始值和外部值的语言特定信息。 - 增加了
TruffleLanguage.getScopedView
,允许包装值以添加语言值的范围和可见性。 - 增加了
TruffleInstrument.Env.getScopedView
和TruffleInstrument.Env.getLanguageView
,以从工具访问语言和范围视图。 - 增加了
TruffleInstrument.Env.getLanguageInfo
,用于将语言类转换为LanguageInfo
。 - 增加了
@GenerateLibrary(dynamicDispatchEnabled = false)
,允许禁用库的动态分派语义。默认值为true
。 - 增加了通过服务提供商加载库的外部默认导出的能力。请参阅
GenerateLibrary(defaultExportLookupEnabled = true)
。 - 增加了
@ExportLibrary(transitionLimit="3")
,允许导出的库的接受条件在为接收器实例创建的库中从 true 转换为 false。这对于导出数组策略的消息非常有用。 - 增加了对语言和工具的异步堆栈跟踪支持,以允许调试器显示它们。
要查看 API 的完整更改列表,请前往 GraalVM Truffle 变更日志。