00 GraalVM发展背景

        熟悉Java的开发者都听说过HotSpot JVM虚拟机的鼎鼎大名,但是在线上业务逐渐往云原生、微服务架构推动的当下,以HotSpot虚拟机为代表的上一代虚拟机也面临着诸多问题。云原生和微服务的时代,对线上系统的性能有了更高的要求,同时基础架构建设的成本需要得到控制。

        某种程度上说,速度(包括但不限于运行速度、编译速度等)、灵巧性(可移植、可复用等)和轻量级是掌控当前线上运行环境的关键。

        2022年1月18日,Oracle公司发布了GraalVM虚拟机的22.0.0版本,并发布了20版本和21版本的新版本(20.3.5和21.3.1)。其中,21.3版本是最近的一个长期支持版本(Long Term Support, LTM),下一个LTS版本预计于2023年发布(23.3)。

        (之前的发布在公众号看不到的,改为群发重新发一下)

01 GravvlVM特点

以下翻译自官网。

更快,更轻量化的应用

        作为新型的虚拟机技术,GraalVM不但致力于解决大型企业的应用场景,也着眼于各种微服务的应用场景。

        GraalVM Enterprise基于受信任且安全的Oracle Java SE构建,在消耗更少资源的同时加快了应用程序性能,提高了应用程序效率并降低了IT成本。

        以在工作负载不断增长的数据中心为例,使用GraalVM虚拟机,运维负责人能够使用相同的计算基础设施处理更多的请求,进而可以减少硬件成本的指出,在相同的计算需求下减少计算资源,进而减少云上计算的成本(PS:鬼佬就这么多废话嘛,翻来覆去颠三倒四地为了降低查重率吗)。

GraalVM的主要优势:

  • 新型的编译器

  • 原生镜像技术

  • 语言互操作性

  • 基于Oracle Java SE构建

  • 受信任的Oracle支持和更新

(注:有几个优点都是因为亲爹是Oracle……)

新的编译器

    GraalVM 的Just in time (JIT) 编译器可加速任何基于 Java 或 JVM 的应用程序的性能 - 这意味着开箱即用,无需任何代码更改。

    总体而言,相比于老版本的编译器,在 GraalVM Enterprise 上运行的应用程序表现出较低的延迟,更少的请求响应时间和更快的应用程序运行速度,并能更快地释放 CPU 和内存,允许它们处理其他请求或在同一服务器上运行的其他应用程序。

本地镜像技术

        GraalVM 将新的编译器技术整合到先进的ahead-of-time(AOT)编译技术:Native Image(本地镜像,先这么翻译吧)。业界领先(注:原文如此……)的本地镜像生成器将基于 Java 和 JVM 的应用程序转换为本机平台可执行文件,这些可执行文件享有令人难以置信的快速启动时间,因为程序初始化是在构建时完成的。所以执行实际业务任务时,应用程序已经编译完成,省去了编译耗时。

        基于本地镜像技术,Java应用程序消耗的资源只相当于在JVM上运行时的一小部分,因此GraalVM Enterprise非常适合不同类型的云部署。

语言互操作性

        GraalVM Enterprise打破了编程语言之间的障碍。

        Java是目前构建企业应用程序最流行的语言(注:本当に?go表示在追赶了),但JavaScript、Python、Ruby、R和其他编程语言在特定领域,比如机器学习,也占有一席之地。一些语言提供了独特的、包含不同特征的lib库,开发人员经常使用不同的语言来实现特定的应用程序。

        GraalVM 为Java之外的许多语言提供高性能运行时支持,允许不同语言和该语言的lib库进行互操作,并且不会造成性能损失。由于允许开发人员指定多种不同的开发语言,这显著地提高了开发效率,下图是GraalVM支持的语言。

        GraalVM的多语言支持的关键是其遵从了各语言的规范。对于每种受支持的语言,GraalVM Enterprise都严格遵守每种语言的规范。Gravvl虚拟机会运行各个语言的编译测试代码,以确保对各个语言的兼容性。

        与此同时,Oracle公司参与了Ecma International等多个标准机构来跟踪各个语言的变化,确保了GravvlVM实时适配最新规范。与此同时。GraalVM的创新反过来也在不同语言的影响规范,比如OpenJDK最近宣布的Leyden项目,该项目旨在为基于本地镜像技术(就是之前提及的技术)的Java二进制可执行文件提供标准规范。

受信任的Oracle支持和更新

        GraalVM企业客户可以利用全天候访问经验丰富的GraalVM企业支持团队的机会,该团队与Oracle Java支持团队密切合作。

        GraalVM企业版包括所有Oracle Java关键补丁更新(CPU),这些更新会定期发布,以修复缺陷和已知漏洞。

    

 02 中文解释

关于上述官方的一些特性,整理了一些官方文档。

参考链接:

知乎

https://zhuanlan.zhihu.com/p/137836206

关于支持不同语言:  

    Graal VM的基本工作原理是将这些语言的源代码(例如JavaScript)或源代码编译后的中间格式(例如LLVM字节码)通过解释器转换为能被Graal VM接受的中间表示(Intermediate Representation,IR),譬如设计一个解释器专门对LLVM输出的字节码进行转换来支持C和C++语言,这个过程称为“程序特化”(Specialized,也常称为Partial Evaluation)。Graal VM提供了Truffle工具集来快速构建面向一种新语言的解释器,并用它构建了一个称为Sulong的高性能LLVM字节码解释器。

    以更严格的角度来看,Graal VM才是真正意义上与物理计算机相对应的高级语言虚拟机,理由是它与物理硬件的指令集一样,做到了只与机器特性相关而不与某种高级语言特性相关。Oracle Labs的研究总监Thomas Wuerthinger在接受InfoQ采访时谈到:“随着Graal VM 1.0的发布,我们已经证明了拥有高性能的多语言虚拟机是可能的,并且实现这个目标的最佳方式不是通过类似Java虚拟机和微软CLR那样带有语言特性的字节码”。对于一些本来就不以速度见长的语言运行环境,由于Graal VM本身能够对输入的中间表示进行自动优化,在运行时还能进行即时编译优化,往往使用Graal VM实现能够获得比原生编译器更优秀的执行效率,譬如Graal.js要优于Node.js、Graal.Python要优于CPtyhon,TruffleRuby要优于Ruby MRI,FastR要优于R语言等等。

关于即时编译:

        提前编译是相对于即时编译的概念,提前编译能带来的最大好处是Java虚拟机加载这些已经预编译成二进制库之后就能够直接调用,而无须再等待即时编译器在运行时将其编译成二进制机器码。理论上,提前编译可以减少即时编译带来的预热时间,减少Java应用长期给人带来的“第一次运行慢”不良体验,可以放心地进行很多全程序的分析行为,可以使用时间压力更大的优化措施。

        但是提前编译的坏处也很明显,它破坏了Java“一次编写,到处运行”的承诺,必须为每个不同的硬件、操作系统去编译对应的发行包。也显著降低了Java链接过程的动态性,必须要求加载的代码在编译期就是全部已知的,而不能再是运行期才确定,否则就只能舍弃掉已经提前编译好的版本,退回到原来的即时编译执行状态。

        直到Substrate VM出现,才算是满足了人们心中对Java提前编译的全部期待。Substrate VM是在Graal VM 0.20版本里新出现的一个极小型的运行时环境,包括了独立的异常处理、同步调度、线程管理、内存管理(垃圾收集)和JNI访问等组件,目标是代替HotSpot用来支持提前编译后的程序执行。它还包含了一个本地镜像的构造器(Native Image Generator)用于为用户程序建立基于Substrate VM的本地运行时镜像。这个构造器采用指针分析(Points-To Analysis)技术,从用户提供的程序入口出发,搜索所有可达的代码。在搜索的同时,它还将执行初始化代码,并在最终生成可执行文件时,将已初始化的堆保存至一个堆快照之中。这样一来,Substrate VM就可以直接从目标程序开始运行,而无须重复进行Java虚拟机的初始化过程。但相应地,原理上也决定了Substrate VM必须要求目标程序是完全封闭的,即不能动态加载其他编译期不可知的代码和类库。基于这个假设,Substrate VM才能探索整个编译空间,并通过静态分析推算出所有虚方法调用的目标方法。

        Substrate VM补全了Graal VM“Run Programs Faster Anywhere”愿景蓝图里最后的一块拼图,让Graal VM支持其他语言时不会有重量级的运行负担。譬如运行JavaScript代码,Node.js的V8引擎执行效率非常高,但即使是最简单的HelloWorld,它也要使用约20MB的内存,而运行在Substrate VM上的Graal.js,跑一个HelloWorld则只需要4.2MB内存而已,且运行速度与V8持平。Substrate VM 的轻量特性,使得它十分适合于嵌入至其他系统之中,譬如Oracle自家的数据库就已经开始使用这种方式支持用不同的语言代替PL/SQL来编写存储过程(注:知乎这篇文章写得很清晰,指出了Graavl是“轻量级”虚拟机的原因)。

GraavlVM的缺点

        因为采用了即时编译技术,GravvlVM对Java的反射、动态加载(比如加载cglib,修改字节码等)等技术的支持就变得尴尬,这里我就不赘述了,有兴趣的大家看看原文。

(又注:尿了,知乎这个作者就是写《深入理解Java虚拟机的大佬》,膜拜。)

03 参考链接

  1. https://zhuanlan.zhihu.com/p/137836206
  2. https://www.graalvm.org/
  3. http://javakk.com/2101.html
  4. https://www.sohu.com/a/375404869_355142
  5. http://ifeve.com/%E4%B8%8B%E4%B8%80%E4%BB%A3%E7%9A%84%E5%A4%9A%E8%AF%AD%E8%A8%80jvm%EF%BC%9Agraalvm/

 

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐