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 内存使用情况的支持:VisualVM: Visualizing Libgraal Memory

  • 英特尔跳跃条件代码 (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 采样器和覆盖率增加了对 cProfiletrace 模块的支持。
  • 增加了对 macOS 上 NumPy 的支持。
  • 增加了对 setuptools-scmpytz.timezone 的支持。
  • 增加了对从 yield 和 return 语句中可迭代解包的新语法的支持。
  • 修复了 Chrome 调试器中非 Python 数字的检查和打印问题。
  • 修复了当这些上下文在多个线程上并发运行时,不同上下文之间 AST 共享的问题。
  • 修复了向 gethostbyname 传递非 ASCII 字符串的问题。
  • 改进了 Jython 兼容模式:当与 is 运算符比较时,将 Java null 视为与 Python None 相同。
  • 改进了 Jython 兼容模式:isinstance 现在适用于 Java 类和对象。
  • 将所有 GraalPython 特定函数从 sysbuiltins 移至 _graalpython_ 模块。

要查看完整的更改列表,请参阅项目变更日志

R

  • 基于 graphicsgrDevicesJavaGD 包的改进图形支持预览
    • 使用 --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
  • 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_barrierTruffle::Primitive.logical_processorsTruffle::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 事件的堆栈跟踪。
理想图可视化工具
  • 增加了按会话分组的图表转储:Ideal Graph Visualizer: Grouping of Graph Dumps

  • 新增了转到编译器类的操作。
  • 提高了 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 添加了新的元数据 API
    • has/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.getScopedViewTruffleInstrument.Env.getLanguageView,以从工具访问语言和范围视图。
  • 增加了 TruffleInstrument.Env.getLanguageInfo,用于将语言类转换为 LanguageInfo
  • 增加了 @GenerateLibrary(dynamicDispatchEnabled = false),允许禁用库的动态分派语义。默认值为 true
  • 增加了通过服务提供商加载库的外部默认导出的能力。请参阅 GenerateLibrary(defaultExportLookupEnabled = true)
  • 增加了 @ExportLibrary(transitionLimit="3"),允许导出的库的接受条件在为接收器实例创建的库中从 true 转换为 false。这对于导出数组策略的消息非常有用。
  • 增加了对语言和工具的异步堆栈跟踪支持,以允许调试器显示它们。

要查看 API 的完整更改列表,请前往 GraalVM Truffle 变更日志

联系我们