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 的最后一个版本。

它还包括

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 的所有先前版本。

此版本中的其他更改

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 的所有先前版本。

此版本中的其他更改

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 getFieldIDgetMethodID 方法的测试,以确保类已初始化。

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 版本还包括以下内容

有关 Oracle 关键补丁更新和安全警报的更多信息,请访问 公告列表

请注意,对于 Java 11 上的 GraalVM Enterprise Edition,java -version 会错误地报告基于 11.0.6+1 的版本,而实际版本是 11.0.6+8。GraalVM 构建过程中的此问题将在未来版本中得到解决。

以下是此版本中解决的问题

  • 解决了当应用程序使用非 JDK 相关服务时,SecurityServicesFeature 抛出 NullPointerException 的问题(#1893)。
  • 努力使 代码覆盖率命令行工具 更加可靠(#1800)。
  • 通过替换所有本地方法,防止了 UnsafeClassLoader 中的链接错误(#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 中,ReduceInitialCardMarksOptBulkAllocation 一起使用是不安全的(参见 #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 9JDK 10JDK 11 的发行说明中都有详细说明。

在语言方面,JDK11 上的 GraalVM 支持所有 JVM 语言(Java、Scala 等),以及目前在 JDK8 上的 GraalVM 中支持的所有客座语言。由于基础 JDK 的模块化结构,基于 JDK 11 的 GraalVM 包中不再有 $JAVA_HOME/jre/ 目录。这会影响语言位置的路径,例如,$JAVA_HOME/jre/languages/js 现在变为 $JAVA_HOME/languages/js

Package Comparison

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 列出,您需要

  1. 将 GraalVM 存档解压到 /Library/Java/JavaVirtualMachines/ 位置
  2. mkdir /Library/Java/JavaVirtualMachines/graalvm-ce-java11-19.3.0/Contents/MacOS
  3. cd /Library/Java/JavaVirtualMachines/graalvm-ce-java11-19.3.0/Contents/MacOS
  4. ln -s ../Home/lib/jli/libjli.dylib

此问题将在下一版本中修复。

ARM64 上的 GraalVM JDK 11

我们提供了 ARM64 架构上基于 JDK 11 的 GraalVM Community Edition 的预览版。它包括对所有 JVM 语言的支持。对其他语言的支持应很快跟进。此分发版开箱即用地包含了 GraalVM Native Image,以便在 ARM64 环境中构建即时启动且内存占用更少的应用程序。

目前此分发版存在一些已知限制

  • npmnode 不支持运行时代码安装(Truffle 编译)。为避免出现 java.lang.NullPointerException 错误,请使用 npm --vm.Dgraal.TruffleCompilation=falsenode --vm.Dgraal.TruffleCompilation=false 禁用 Truffle 编译。
  • npmnode 会因 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.allSettledNullish coalescing),并在 ECMAScript 2020 模式 (--js.ecmascript-version=2020) 下可用。

为了更好地与 ECMAScript 规范兼容,某些扩展现在默认禁用,其中一些取决于启动器(jsnode 或通过 GraalVM Polyglot Context)。这包括 printprintErr 函数(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())
  • 实现了缺失的函数并修复了错误,以运行各种模块(timeitsocketpytest)。
  • 改进了 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
  • 对基于 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 表达式中支持布尔字面量。在表达式中使用 truefalse,例如 isFunction(value) == false
  • 增加了对临时文件和目录的支持。
  • 嵌入器创建的线程现在可以在它们被释放之前由 GC 回收。如果语言通过 initializeThread 暴露线程对象,它们现在需要使用 WeakReference 来这样做。这避免了线程实例的泄漏。
  • LoopNode 添加了新的 execute 方法,该方法允许循环返回值。

要查看 API 的完整更改列表,请参阅 GraalVM Truffle 更新日志

联系我们