赞
踩
熟悉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)。
(之前的发布在公众号看不到的,改为群发重新发一下)
以下翻译自官网。
更快,更轻量化的应用
作为新型的虚拟机技术,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),这些更新会定期发布,以修复缺陷和已知漏洞。
关于上述官方的一些特性,整理了一些官方文档。
参考链接:
知乎
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虚拟机的大佬》,膜拜。)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。