使用JDK 16构建的GraalVM 21.1发布!


更快的预热,更小的下载量,使用JDK 16构建的GraalVM 21.1发布!
可从以下网站下载GraalVM 21.1:


在本文中,我们要重点介绍GraalVM 21.1中一些最重要的改进。如果您对特定组件感兴趣,并希望查看更改的详细列表,请查阅21.1发行说明
 
平台更新
Oracle GraalVM Enterprise Edition 21.1基于Oracle JDK 1.8.0_291版和Oracle JDK 11.0.11版。21.1中的GraalVM社区版基于OpenJDK版本1.8.0_292和OpenJDK版本11.0.11。
GraalVM 21.1针对基于JDK 16.0.1的企业版和社区版引入了基于JDK 16的新实验二进制文件。
实验状态意味着基于JDK 16的二进制文件中的所有组件都被视为实验性的,无论它们在其他发行版中的状态如何。
Java应用程序的JIT模式可能是这些构建版本中经过最严格测试的功能,因此,如果您希望通过GraalVM编译器运行Java应用程序,或者当前在任何其他JDK 16 OpenJDK构建版本中使用JVMCI编译器,请考虑尝试GraalVM二进制文件。其中包括最新的OpenJDK更改和最新的GraalVM编译器更改,这是两全其美的设置。
 
不包含Node.JS
GraalVM 21.1中包含的Node.js已更新至14.16.1,建议大多数用户使用。
GraalVM中关于Node的另一项重大更改。从GraalVM 21.1开始,基本GraalVM下载中不再包括对Node.js的支持。现在,它是一个单独的组件,您可以使用该gu install nodejs命令进行安装。JavaScript支持仍然是基础下载的一部分,只是Node.js支持可单独安装。此项更改是为了提高速度和清晰度-旨在减少基本GraalVM下载的大小,并减少一些希望主要使用GraalVM作为其主要JDK的用户的困惑。
 
编译器更新
编译器的更新特别令人兴奋,因为它们全面改善了GraalVM,因为编译器为GraalVM支持的所有各种语言的性能奠定了基础!
在21.1中,有两个特别有趣的编译器改进:
一项新的优化消除了x86上连续易失性写入的不必要的内存障碍。内联代码后,有时会按顺序发生许多易失性写操作。GraalVM编译器现在忽略了除序列中最后一次写操作以外的所有操作的内存屏障,从而很好地加快了诸如ConcurrentHashMap.transfer()方法的速度。
另一个主要改进可以帮助提高类似工作负载的性能,而更多的是修复而不是全新的优化。在以下示例方法中,同样来自ConcurrentHashMap,Unsafe用于从数组中获取对象。通过此修复程序,GraalVM编译器消除了强制类型转换:
static final <K,V> Node<K,V> tabAt(Node<K,V>[] tab, int i) {      
  return (Node<K,V>)U.getObjectVolatile(
                      tab,                                        
                      ((long)i << ASHIFT) + ABASE); 
}

 
循环更新
对于热代码路径中具有反向循环的应用程序,我们已经看到性能提高了40%!频繁使用反向循环的一个突出示例是GraalVM中的LLVM位代码运行时。它编译LLVM IR,Clang中的内部循环表示通常类似于倒置循环。
在这方面的第二个改进是新颖的循环反转优化。这为GraalVM Enterprise添加了编译器支持,以从常规循环生成反向循环。我们已经看到,使用倒置回路形状的微型基准测试的性能提高了30%。
 
本机图像Native Image
与每个版本一样,Native Image中还包含许多已修复的问题和兼容性改进,以及新功能。
GraalVM 21.1增加了对Native Image中多个语言环境的支持。现在,您可以在构建时指定在生成的可执行文件中应包含哪些语言环境。
此版本改进了对Windows上Native Image的支持。现在,使用本机映像构建的应用程序会在参数上进行文件遍历。Globbing解释标准的特殊字符,例如*和?匹配文件名。
还有其他不错的添加,例如在Native Image构建上添加了报告,以生成多个工件,并将结果写入<image-name>.build_artifacts.txt文件中。同样,可以在同一过程中使用多个不同的Native Image编译工件。例如,使用Native Image构建的应用程序可以使用本机映像生成的共享库。
 
多语言运行时
如果您使用任何一种Truffle语言:JavaScript,Python,Ruby,R,Webassembly,Truffle上的Java,TruffleSqueak,LLVM位代码等,更改多语言运行时对您的应用程序都很重要!
GraalVM 21.1中的multiglot运行时默认情况下启用了多层编译。此功能最初是在20.3版中作为实验性选项引入的。启用后,Truffle会为多语种语言使用两层编译。第一层针对编译速度进行了优化,并重用了GraalVM编译器的经济配置,仅使用普通方法的方法内联来执行快速编译;第二层编译会启用所有GraalVM的编译器优化功能,并在第一层编译完成后执行。我们的基准测试结果表明,这可以显着改善大多数语言的预热。
除了通过多层编译来改善预热之外,此版本还包括一个受HotSpot启发的新实验编译队列实现。
Truffle语言的启动和预热性能应该比以前的版本有显着提高!
 
对于多语种嵌入/来宾语言用户
如果您正在使用Java应用程序中的Truffle语言,则此处列出的更改对您来说可能很重要。
GraalVM 21.1中添加的一项有趣的新功能是访客语言安全点的实现。用于Context.safepoint()在执行宿主方法时以协作方式轮询多语言上下文的线程本地操作。
 
Ruby
与每个版本一样,GraalVM 21.1反映了Ruby的大量兼容性和性能工作,包括对Ruby 2.7的更完整支持(其余工作可以在GitHub issue中看到)。
现在默认情况下启用了多层编译,这大大改善了预热。其他项目(检查递归,生成随机数,使用类变量的某些情况irb以及将代码粘贴到其中)irb在此版本中也都得到了改进。
 
Python
GraalVM 21.1 for Python中最重要的改进之一是对Java子类的增强支持和新的互操作API,以实现更好的Jython迁移路径。GraalVM现在经常要求提供Jython功能,这些功能包括从Java进行Python类型的迭代,在Python代码中捕获和重新抛出Java异常,以及从Python实现Java抽象类和接口,这使得GrayVM现在提供了Jython功能,从而使迁移变得更加容易。
另一个非常令人兴奋的功能是SSL支持。现在,您可以pip像使用CPython一样安装软件包及其依赖项:
此外,我们还添加了带有全局解释器锁(GIL)的多线程功能,从而在GraalVM 21.1的Python支持中总结了令人兴奋的新功能。GraalPython支持与CPython相同程度的多线程,也就是说,大多数工作负载只有并发性,而没有并行性。
 
WebAssembly
GraalVM 21.1具有两个主要的改进主题:兼容性和性能。遵循这种理念,现在JavaScript和WebAssembly的集成度比以前好得多,现在允许JavaScript调用WebAssembly。现在实现了基本的WASI功能,该功能允许通过Truffle文件系统层来操作文件和访问文件系统…而性能结果令人难以置信!
除了提高独立GraalWasm启动器的速度和在GraalVM上提高WebAssembly的峰值性能外,主要的亮点是解释器的性能提高了10倍以上,这在短期运行的程序或仅被调用的代码中最为明显。
 
Truffle上Java
GraalVM 21.0版本是Truffle上Java的第一个版本。从那时起,我们一直专注于兼容性,并确保它对于在典型的开发方案中运行典型的应用程序很有用。
启用调试器从而加快了应用程序的运行速度的200倍!
 
工具
VisualVM现在也可以在JDK 16上运行,并且支持在Apple M1芯片上运行。