- 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
19.3.6
(2021-04-20)
GraalVM Community Edition 19.3.6 是一个关键补丁更新(CPU)版本。它基于 OpenJDK CPU,并包含了作为该 CPU 一部分发布的所有 OpenJDK 安全修复。这是一个完整的分发版,取代了 GraalVM Community Edition 19.3.x 的先前版本。请注意,这是 GraalVM Community Edition 19.3.x 的最后一个版本。
它还包括
- 更新到适用于 Java 8 的 GraalVM Community 版的 8u292,请参阅 OpenJDK 8u292 Updates
- 更新到适用于 Java 11 的 GraalVM Community 版的 11.0.11,请参阅 OpenJDK 11.0.11 Updates
- Node.js 运行时更新到 12.22.1 版本,其中包含 2021 年 4 月安全发布中提到的所有安全修复。
19.3.5
(2021-01-19)
GraalVM Community Edition 19.3.5 是一个关键补丁更新(CPU)版本。它基于 OpenJDK CPU,并包含了作为该 CPU 一部分发布的所有 OpenJDK 安全修复。这是一个完整的分发版,取代了 GraalVM 19.3.x 的先前版本。
它还包括以下内容
- 更新到适用于 Java 8 的 GraalVM Community 版的 OpenJDK 8u282 版本,请参阅 OpenJDK 8u282 Updates
- 更新到适用于 Java 11 的 GraalVM Community 版的 OpenJDK 11.0.10 版本,请参阅 OpenJDK 11.0.10 Updates
19.3.4
(2020-11-03)
GraalVM Community Edition 19.3.4 是一个关键补丁更新(CPU),包含安全漏洞和严重错误的修复。GraalVM Community Edition 19.3.4 基于 OpenJDK CPU,并包含了作为该 CPU 一部分发布的所有 OpenJDK 安全修复。这是一个完整的分发版,取代了 GraalVM 19.3 的所有先前版本。
此版本中的其他更改
- 更新 Java 到适用于 Java 8 的 GraalVM 的 8u272 版本,请参阅 OpenJDK 8u272 Release notes
- 更新 Java 到适用于 Java 11 的 GraalVM 的 11.0.9 版本,请参阅 OpenJDK 11.0.9 Release notes
19.3.3
(2020-08-04)
GraalVM Community Edition 19.3.3 是一个关键补丁更新(CPU),包含安全漏洞和严重错误的修复。GraalVM Community Edition 19.3.3 基于 OpenJDK CPU,并将包含作为该 CPU 一部分发布的所有 OpenJDK 安全修复。这是一个完整的分发版,取代了 GraalVM 19.3 的所有先前版本。
此版本中的其他更改
- 更新 Java 到适用于 Java 8 的 GraalVM 的 8u262 版本,请参阅 OpenJDK 8u262 Release notes
- 更新 Java 到适用于 Java 11 的 GraalVM 的 11.0.8 版本,请参阅 OpenJDK 11.0.7 Release notes
19.3.2
(2020-05-12)
GraalVM Community Edition 19.3.2 是一个关键补丁更新(CPU),仅包含安全和错误修复,并取代了 GraalVM 19.3 的所有先前版本。
此版本包括
- Java 更新到适用于 Java 8 的 GraalVM 的 8u252 版本,请参阅 [OpenJDK 8u252 Release notes]https://adoptopenjdk.net/release_notes.html#jdk8u252)。
- Java 更新到适用于 Java 11 的 GraalVM 的 11.0.7 版本,请参阅 OpenJDK 11.0.7 Release notes。
此版本中的其他严重错误修复
- 使得 Chrome 调试器多次调用 getter 函数以测试副作用。
- 修复了一个问题,即 LLVM 上下文通过不缓存单次使用的
System.getenv()
,可能将用户目录信息发送到图像堆中。 - 使用
@Delete
替换DynamicHub
中缺失的本地方法(参见 #2054)。 - 添加了 JNI
getFieldID
和getMethodID
方法的测试,以确保类已初始化。
19.3.1
(2020-01-14)
这是针对 GraalVM Enterprise 和 Community 版本的关键补丁更新(CPU)。19.3.1 版本包含 2020 年 1 月 Oracle 关键补丁更新公告中确定的安全漏洞、严重错误和其他修复。Oracle GraalVM Enterprise Edition 19.3.1 包含了作为该 CPU 一部分发布的所有 Java 安全修复。
19.3.1 版本还包括以下内容
- 更新 Java 到适用于 Java 8 的 GraalVM 的 8u241 版本,请参阅 Java SE 8 Release notes。
- 更新 Java 到适用于 Java 11 的 GraalVM 的 11.0.6 版本,请参阅 Java SE 11 Release notes。
- 更新 Ruby 到 2.6.5 版本,请参阅 Ruby 2.6.5 release notes。
- 更新 Node.js 到 12.14.0 版本,请参阅 Node.js 12.14.0 release notes。
有关 Oracle 关键补丁更新和安全警报的更多信息,请访问 公告列表。
请注意,对于 Java 11 上的 GraalVM Enterprise Edition,java -version
会错误地报告基于 11.0.6+1
的版本,而实际版本是 11.0.6+8
。GraalVM 构建过程中的此问题将在未来版本中得到解决。
以下是此版本中解决的问题
- 解决了当应用程序使用非 JDK 相关服务时,
SecurityServicesFeature
抛出NullPointerException
的问题(#1893)。 - 努力使 代码覆盖率命令行工具 更加可靠(#1800)。
- 通过替换所有本地方法,防止了
Unsafe
和ClassLoader
中的链接错误(#1920)。 - 使得为静态库动态生成
On_Load_*
函数调用,以便在图像生成之前知道所有库,从而防止-Djava.net.preferIPv6Addresses=true
返回不正确的值(#1937)。 - 修复了在运行原生镜像时
ProcessHandle
属性不提供有用值的问题(#2001)。 - 修复了当单个引擎在多个线程本地多语言上下文之间共享时,
java.util.WeakHashMap.get
访问不同步的问题(#1916)。 - 修复了 macOS
/usr/libexec/java_home -V
无法识别 JDK 11 GraalVM 构建版本的问题(#801)。 - 实现了 JSON 2.3.0 使用的新 C API(#1857)。
- 确保 GraalVM Native Image 不引用
java.lang.reflect.Proxy
中的本地方法(#1971)。 - 确保核心类的所有本地方法都将被替换,以防止反射配置问题(#1848)。
- 修复了导致 JavaFX 应用程序在使用
GraalArithmeticStubs
时行为异常的问题(#1867)。 - 确保从多个线程调用的
DynamicProxySupport
类是线程安全的(#1927)。 - 防止原生镜像生成期间静态字段值发生改变(#1945)。
- 修复了在图像写入阶段,当镜像使用来自不受支持的静态 JDK 库的函数时,原生链接步骤出现的问题(#1875)。
19.3.0.2
(2019-12-24)
这是一个错误修复更新,包括对 JVM 编译器接口(JVMCI)的修复以及对 JDK 11 支持的必要更新。解决了以下问题:
- 解决了当
DynamicProxySupport.addProxyClass
从多个线程调用时,DynamicProxySupport
不是线程安全的问题(参见 #1927)。 - 解决了 GraalVM
native-image
构建器在优化级别 2 (-H:Optimize=2
) 下生成的代码执行错误的问题(参见 #1995)。 - 修复了 JavaFX 应用程序在使用
GraalArithmeticStubs
时行为异常的问题(参见 #1867)。 - 解决了使用 Serial GC 运行时虚拟机崩溃的问题(参见 #1892)。
- 在 JDK 11 中,
ReduceInitialCardMarks
与OptBulkAllocation
一起使用是不安全的(参见 #1915)。 - 修复了基于 JDK11 的 GraalVM 构建原生镜像时出现的瞬时崩溃问题(参见 #1906)。
19.3.0
(2019-11-19)
GraalVM 19.3 是第一个计划中的中期支持(MTS)版本,它基于项目主线构建。这也是一个主要功能版本,建议升级到此版本。MTS 状态确保在未来 18 个月内,稳定性、安全性和性能修复将从当前分支回溯。
基于 GraalVM JDK 11 的构建
随着 19.3 版本的主要更新,我们宣布了基于 JDK 11 的首个 GraalVM 版本!考虑到 JDK 8 和 JDK 11 之间的差异,这代表了一个重要的里程碑。特别是,JDK 9 中引入的 Java 平台模块系统(JPMS)意味着 GraalVM 现在使用模块封装来隔离 JVMCI、GraalVM 编译器和 Truffle API 等代码与应用程序代码。此外,这意味着 JDK 11 上的 GraalVM 包含了自 JDK 8 以来的所有 JDK 更改。这些更改在 JDK 9、JDK 10 和 JDK 11 的发行说明中都有详细说明。
在语言方面,JDK11 上的 GraalVM 支持所有 JVM 语言(Java、Scala 等),以及目前在 JDK8 上的 GraalVM 中支持的所有客座语言。由于基础 JDK 的模块化结构,基于 JDK 11 的 GraalVM 包中不再有 $JAVA_HOME/jre/ 目录。这会影响语言位置的路径,例如,$JAVA_HOME/jre/languages/js 现在变为 $JAVA_HOME/languages/js。
JDK 11 上的 GraalVM Native Image 允许使用所有 JDK 8 命令行选项。目前,原生镜像构建器 ($JAVA_HOME/bin/native-image
) 不支持 Java 平台模块系统(JPMS),并且在镜像运行时没有模块内省功能。
请注意,目前 GraalVM Updater 无法在 JDK 11 上使用 GraalVM Enterprise 和 Community 版本重建镜像 ($JAVA_HOME/bin/gu rebuild-images
)。即使安装了 GraalVM Native Image,用户在重建时也会遇到以下错误:
$ $JAVA_HOME/bin/gu rebuild-images ruby
Error: rebuild-images utility is not available. You may need to install "native-image" component.
Please refer to documentation for the details.
一种可能的解决方法是直接调用 rebuild-images
命令重建镜像,例如:
$JAVA_HOME/bin/rebuild-images ruby
请注意,若要使 macOS 上基于 GraalVM JDK 11 的构建版本被 /usr/libexec/java_home -V
列出,您需要
- 将 GraalVM 存档解压到
/Library/Java/JavaVirtualMachines/
位置 mkdir /Library/Java/JavaVirtualMachines/graalvm-ce-java11-19.3.0/Contents/MacOS
cd /Library/Java/JavaVirtualMachines/graalvm-ce-java11-19.3.0/Contents/MacOS
ln -s ../Home/lib/jli/libjli.dylib
此问题将在下一版本中修复。
ARM64 上的 GraalVM JDK 11
我们提供了 ARM64 架构上基于 JDK 11 的 GraalVM Community Edition 的预览版。它包括对所有 JVM 语言的支持。对其他语言的支持应很快跟进。此分发版开箱即用地包含了 GraalVM Native Image,以便在 ARM64 环境中构建即时启动且内存占用更少的应用程序。
目前此分发版存在一些已知限制
npm
和node
不支持运行时代码安装(Truffle 编译)。为避免出现java.lang.NullPointerException
错误,请使用npm --vm.Dgraal.TruffleCompilation=false
或node --vm.Dgraal.TruffleCompilation=false
禁用 Truffle 编译。npm
和node
会因free(): invalid pointer
错误而崩溃。
Native Image
GraalVM 19.3 已切换为使用 JDK 本机代码而非手动替换。对于 GraalVM Native Image,此切换到 Java 本机接口(JNI)平台使得能够支持 JDK 11 并扩展对 Windows 操作系统的支持。它对启动时间或内存占用没有影响,并消除了与使用 Java 加密服务的原生镜像一起分发 libsunec.so
等 JDK 库的需要。GraalVM 现在附带可静态链接的 JDK 库版本。
请注意,SunEC 提供程序的 sunec
本机库如果需要,会静态链接到镜像中(参见 #951)。因此,原生镜像在运行时不再依赖 sunec
共享库。但是,如果 SunEC 提供程序在 Linux 和 macOS 上静态链接到镜像中,则该镜像将依赖 libstdc++
。
Native Image Maven 插件
对在 Maven 中使用 GraalVM Native Image 的支持已随 Native Image Maven 插件一起引入。这意味着用户可以使用 mvn package
命令直接通过 Maven 构建项目及其原生镜像。自 GraalVM 19.3 版本起,包括插件在内的 GraalVM Native Image 相关构件的 Maven <groupId>
已从 com.oracle.substratevm
更改为 org.graalvm.nativeimage
。
<plugin>
<groupId>org.graalvm.nativeimage</groupId>
<artifactId>native-image-maven-plugin</artifactId>
<version>19.3.0</version>
<executions>
<execution>
<goals>
<goal>native-image</goal>
</goals>
<phase>package</phase>
</execution>
</executions>
<configuration>
<skip>false</skip>
<buildArgs>
--no-fallback
</buildArgs>
</configuration>
</plugin>
要使用此插件,请确保 GraalVM home 已设置为您的 JAVA_HOME
环境变量,并且已安装 Native Image。不建议在没有 GraalVM 的情况下使用此插件。
GraalVM 编译器
- 我们改进了
System.arraycopy
,以消除复制到Object[]
时进行存储检查。这一改进修复了某些 Eclipse Collections 基准测试上(相对于 C2)的性能下降问题。 - 通过更优化的内联,修复了在 Scala 中创建 List 值时出现的性能回归问题。
- 修复了一个问题,该问题可能阻止包含由较旧
javac
版本生成的 JSR 字节码的方法被编译(参见 #1699)。
JavaScript
GraalVM 提供的 Node.js 运行时已更新到 12.10.0 版本,这带来了一些破坏性更改。
已实现 ECMAScript 2020 的附加提案(Promise.allSettled
和 Nullish coalescing),并在 ECMAScript 2020 模式 (--js.ecmascript-version=2020
) 下可用。
为了更好地与 ECMAScript 规范兼容,某些扩展现在默认禁用,其中一些取决于启动器(js
、node
或通过 GraalVM Polyglot Context)。这包括 print
和 printErr
函数(js.print
标志)、global
内置(已被 globalThis
取代,使用 js.global-property
标志重新启用),或 performance
全局属性(js.performance
标志)。
更多详细信息可在 GitHub 上的项目 更新日志中找到。
LLVM 解释器
在 GraalVM 19.3 中,构建 GraalVM LLVM 运行时不再需要安装 clang 和其他 LLVM 工具。使用的是 GraalVM 捆绑的 LLVM 工具链。此外,LLVM 工具链不再是“实验性”功能,并已被其他语言使用。
例如,将这段演示与 Java 互操作性的原生代码保存为 polyglot.c 文件
#include <stdio.h>
#include <polyglot.h>
int main() {
void *arrayType = polyglot_java_type("int[]");
void *array = polyglot_new_instance(arrayType, 4);
polyglot_set_array_element(array, 2, 42);
int element = polyglot_as_i32(polyglot_get_array_element(array, 2));
printf("%d\n", element);
return element;
}
现在您可以使用 GraalVM 替代传统 clang
的工具来编译它
$JAVA_HOME/jre/languages/llvm/native/bin/clang polyglot.c -o polyglot
然后运行可执行文件(polyglot
),其依赖项已编码在 GraalVM LLVM 运行时中
lli polyglot
还添加的功能列表
- 对解析 LLVM 9 生成的位代码的初步支持
- 为 pthread 线程管理函数添加了内在函数
- 支持 pthreads LLVM 位代码
请参阅 GitHub 上的组件 更新日志。
Python
- Python 标准库已更新到 3.7.4。
- 已实现对 NumPy 1.16.4 和 Pandas 0.25.0 的支持,可通过以下方式安装:
$ graalpython -m ginstall install numpy
$ graalpython -m ginstall install pandas
- 借助 Weblogic 脚本团队将 Jython 转换为 GraalVM Python 的帮助,增加了 Jython 兼容性(通过
--python.EmulateJython
启用),允许以与 Jython 相同的方式在 Python 中导入 Java 类和捕获 Java 异常。
$ graalpython --jvm --experimental-option --python.EmulateJython
>>> import sun.misc.Signal
>>> from java.lang import Integer, NumberFormatException
>>> try:
... Integer.parseInt("99", 8)
... except NumberFormatException as e:
... pass
- 增加了对基本套接字的支持。请注意,SSL 尚未实现,因此尚不支持
https
。
import urllib.request
print(urllib.request.urlopen("http://google.com").read())
- 实现了缺失的函数并修复了错误,以运行各种模块(
timeit
、socket
、pytest
)。 - 改进了 Java 互操作性、不逃逸的异常、各种 C API 函数和解析器的性能。解析器现在速度提高了约 20%,有时甚至高达约 40%,微基准测试中的性能快了 5 倍,C API 的微基准测试快了 5 倍,但 NumPy 性能数据没有变化。
要查看完整的更改列表,请参阅项目 更新日志。
R
- FastR 已更新到 R 3.6.1 版本。
- 在此版本中,FastR 不附带 GCC 运行时库。请使用以下命令安装必要的依赖项:
- Ubuntu 18.04 和 19.04:
apt-get install libgfortran3 libgomp1
- Oracle Linux 7:
yum install libgfortran libgomp
- Oracle Linux 8:
yum install compat-libgfortran-48
- macOS:
brew install gcc@4.9
- Ubuntu 18.04 和 19.04:
- 对基于 LLVM 执行 R 原生扩展的预览支持。
- FastR 已配置为使用 GraalVM LLVM 工具链来编译 R 包的 C/C++ 和 Fortran 代码。生成的二进制文件将同时包含原生代码和 LLVM 位代码。随 FastR 提供的 R 包也已使用 GraalVM LLVM 工具链编译,其二进制文件包含 LLVM 位代码。
- FastR 默认加载并运行 R 扩展的原生代码,但当使用
--R.BackEnd=llvm
选项运行时,如果可用,它将加载并运行 LLVM 位代码。您可以通过--R.BackEndLLVM=pkg1,pkg2
选项选择性地为特定的 R 包使用 LLVM 后端。 - 如果您在安装 R 包时遇到任何问题,可以通过运行
fastr.setToolchain("native")
或手动编辑$FASTR_HOME/etc/Makeconf
文件,从 GraalVM LLVM 工具链切换回原生工具链。
- 修复了 在 GitHub 上报告的内存泄漏问题。
- 修复了处理大向量(>1GB)时出现的故障。
- 实现了
grepRaw
,但仅支持fixed=T
。
我们鼓励用户尝试新的 LLVM 支持,并将遇到的任何问题报告到 GitHub。要查看完整的更改列表,请参阅项目 更新日志。
Ruby
Ruby 语言组件的完整更改列表可在 GitHub 上获取。
重点在于改进与 Ruby on Rails 应用程序的兼容性。主要更改包括:
- C 扩展的编译现在使用内部 LLVM 工具链完成,该工具链同时生成原生代码和位代码。这意味着更多 C 扩展应该可以开箱即用,并且这应该能解决大多数与链接器相关的问题。
- 在 TruffleRuby 上安装 C 扩展不再需要安装 LLVM。
- 在 TruffleRuby 上安装 C++ 扩展不再需要安装 libc++ 和 libc++abi。
- 在 macOS 上,不再需要安装系统头文件包(#1417)。
- 许可证已更新到 EPL 2.0/GPL 2.0/LGPL 2.1,与最新的 JRuby 类似。
- 现在由于使用了 LLVM 工具链,安装
sassc
可以正常工作(#1753)。 - 包含默认 gem 的可执行文件,Rails 6 中
rails new
所需。
工具
代码覆盖率命令行工具
自 19.3 版本起,GraalVM 提供了一个代码覆盖率命令行工具,用于记录和分析使用 Truffle 框架实现的语言的特定代码执行的源代码覆盖率。可以通过 --codecoverage
选项启用它,例如 js --codecoverage
。访问工具参考文档了解更多信息。
GraalVM VisualVM
- 以前,要查看 JFR 文件,您必须安装一个插件。现在 GraalVM VisualVM 在工具核心中包含了查看器。其他 JFR 查看器改进包括新的异常和 GC 视图、性能和准确性提升。
- 该工具现在能够监控和分析 AArch64 Java 和 Java 13 进程。
调试器
- 在 Chrome Inspector 中启用了对功能断点和内存工具的支持。
Visual Studio Code 扩展
VSCode 扩展以 VSIX 包的形式提供。GraalVM 团队创建了第一个基于 Python 实现的 VSIX 扩展。该扩展通过 npm
包管理器安装,在扩展安装后,系统会要求用户将 PATH
环境变量指向 GraalVM 主目录。
GraalVM 嵌入器(SDK)的更改
- 添加了用于语句计数资源限制的新 API
ResourceLimits.newBuilder()
ResourceLimits.newBuilder()
.statementLimit(1000, null)
.build();
Duration.ofMillis(10))
.statementLimit(1000, null)
.build();
try (Context context = Context.newBuilder()
.resourceLimits(limits).build()) {
context.eval("js", "while(true);");
assert false;
} catch (PolyglotException e) {
assert e.isCancelled();
}
- 默认临时目录现在可以通过
FileSystem
配置。FileSystem
接口的getTempDirectory()
方法将返回默认临时目录。 - 添加了
org.graalvm.home.Version
版本实用程序,该程序允许创建、验证和比较 GraalVM 版本。 - 增加了对检测和映射多语言异常值的支持。可以使用
Value.isException()
检测异常。 - 增加了从客座语言异常到
PolyglotException
的默认目标类型映射。
有关完整的更改列表,请参阅 GraalVM SDK 更新日志。
适用于 GraalVM 语言或工具实现者(Truffle)的更改
- 为语言实现添加了标准块节点。块节点的使用允许优化运行时将块的元素分组到多个块编译单元中。此优化可以通过
--engine.PartialBlockCompilation
(默认启用)启用,并通过--engine.PartialBlockCompilationSize
(默认 3000)进行配置。 - 合并了新的实验性内联启发式。内联预算现在基于 Graal IR 节点计数,而不再是 Truffle 节点计数。
- 在 Truffle DSL 表达式中支持布尔字面量。在表达式中使用
true
或false
,例如isFunction(value) == false
。 - 增加了对临时文件和目录的支持。
- 嵌入器创建的线程现在可以在它们被释放之前由 GC 回收。如果语言通过
initializeThread
暴露线程对象,它们现在需要使用WeakReference
来这样做。这避免了线程实例的泄漏。 - 为
LoopNode
添加了新的 execute 方法,该方法允许循环返回值。
要查看 API 的完整更改列表,请参阅 GraalVM Truffle 更新日志。