【JVM深层系列】「云原生时代的Java虚拟机」针对于GraalVM的技术知识脉络的重塑和探究

简介: 【JVM深层系列】「云原生时代的Java虚拟机」针对于GraalVM的技术知识脉络的重塑和探究

GraalVM 背景


新、旧编程语言的兴起躁动,说明必然有其需求动力所在,譬如互联网之于JavaScript、人工智能之于Python,微服务风潮之于Golang等等。大家都清楚不太可能有哪门语言能在每一个领域都尽占优势,Java已是距离这个目标最接近的选项,但若“天下第一”还要百尺竿头更进一步的话,似乎就只能忘掉Java语言本身,踏入无招胜有招的境界。


  • 更进一步提升JVM上运行的程序的性能
  • 通过预编译(ahead-of-time)编译Java程序为原生可执行程序
  • 多种编程语言混编在一个程序中(polyglot)
  • 类似于LLVM,GraalVM也提供了方便的机制方便开发新的编程语言


官方网站在: www.graalvm.org/




当前痛点


在云原生时代,Java程序是有很大的劣势的,为什么这么说呢?一般的Java应用程序都要几十兆的内存,启动也不不快。


最流行的SpringBoot/SpringCloud微服务框架为例,启动一个已经优化好,很多bean需要lazy load的application至少需要3-4秒时间,内存需要几百兆,业务逻辑稍微复杂一点点,没有1G以上的内存是很难满足业务的需要呢?


那么在云原生时代,一个充满黑科技的JVM介绍给大家,它能帮助我们让Java程序的启动速度加快100倍,内存只需要原来的五分之一,甚至更少。



Graalvm的介绍


  • GraalVM是2018年Oracle开发的下一代JVM实现,被官方称为“Universal VM”和“Polyglot VM”,这是一个在HotSpot虚拟机基础上增强而成的跨语言全栈虚拟机,可以作为“任何语言”的运行平台使用。


  • 这里“任何语言”包括了Java、Scala、Groovy、Kotlin等基于Java虚拟机之上的语言,还包括了C、C++、Rust等基于LLVM的语言,同时支持其他像JavaScript、Ruby、Python和R语言等等。

image.png

GraalVM可以无额外开销地混合使用这些编程语言,支持不同语言中混用对方的接口和对 象,也能够支持这些语言使用已经编写好的本地库文件。


它的口号“Run Programs Faster Anywhere”就能感觉到一颗蓬勃的野心



Graalvm性能的对比


GraalVM的性能真的不错。以JDK 8为例


  • OpenJDK
  • Oracle JDK


其中OpenJDK是通过“GPL v2 with CE”协议开源的,可以免费商用的。


之前在用Apache Spark测试性能时, 对比一下两者性能, 稍微数据量大点的查询,会发现Oracle JDK一般都会比OpenJDK快30%以上。


  • 而GraalVM分为社区版和商业版,其中GraalVM的社区版也是采用了和OpenJDK一样的“GPL v2 with CE”协议开源的。
  • 对于GraalVM的社区版,非常惊喜的发现其比Oracle JDK也会快10%以上。
  • 没有试过GraalVM的商业版, 官方报道,其商业版比社区版提升的性能更多



Graalvm主要特性


  • 高性能的现代Java
  • 占用资源少,启动速度快
  • JavaScript,Java, Ruby以及R混合编程
  • 在JVM上运行原生语言
  • 跨语言工具
  • JVM应用扩展
  • 原生应用扩展
  • 本地Java库
  • 数据库支持多语言
  • 创建自己的语言



Graalvm工作原理


GraalVM的基本工作原理是将这些语言的源代码(例如,JavaScript)或源代码编译后的中间格式(例如,LLVM字节码、Class字节码)通过解释器转换为能被GraalVM接受的中间表示(Intermediate Representation,IR),譬如设计一个解释器专门对LLVM输出的字节码进行转换来支持C和C++语言,这个过程称为“程序特化”(Specialized,也常称为Partial Evaluation)。


GraalVM提供了Truffle工具集来快速构建面向一种新语言的解释器,并用它构建了一个称为Sulong的高性能LLVM字节码解释器。


从某个角度来看,GraalVM才是真正意义上与物理计算机相对应的高级语言虚拟机,因为它与物理硬件的指令集一样,做到了只与机器特性相关而不与某种高级语言特性相关。



Graalvm的高等优化能力


Oracle Labs的研究总监Thomas Wuerthinger在接受采访时谈到:“随着GraalVM1.0的发布,已经证明了拥有高性能的多语言虚拟机是可能的,并且实现这个目标的最佳方式不是通过类似Java虚拟机和微软CLR那样带有语言特性的字节码”。


本来就不以速度见长的语言运行环境,由于GraalVM本身能够对输入的中间表示进行自动优化,在运行时还能进行即时编译优化,往往使用GraalVM实现能够获得比原生编译器更优秀的执行效率,譬如Graal.js要优于Node.js、Graal.Python要优于CPtyhon,TruffleRuby要优于Ruby MRI,FastR要优于R语言等等。


Graalvm与Hotspot的对比


GraalVM本来就是在HotSpot基础上诞生的,天生就可作为一套完整的符合Java SE8标准Java虚拟机来使用。


它和标准的HotSpot差异主要在即时编译器上,其执行效率、编译质量目前与标准版的HotSpot相比也是互有胜负。


Oracle Labs和美国大学里面的研究院所做的最新即时编译技术的研究全部都迁移至基于GraalVM之上进行了,其发展潜力令人期待。


如果Java语言或者HotSpot虚拟机真的有被取代的一天,那从现在看来GraalVM是希望最大的一个候选项,这场革命很可能会在Java使用者没有明显感觉的情况下悄然而来,Java世界所有的软件生态都没有发生丝毫变化,但天下第一的位置已经悄然更迭。



Graalvm即时编译器


自JDK 10起,HotSpot中又加入了一个全新的即时编译器:Graal编译器,看名字就可以联想到它是来自于Graal VM。



C1/C2即时编译器


对需要长时间运行的应用来说,由于经过充分预热,热点代码会被HotSpot的探测机制准确定位捕获,并将其编译为物理硬件可直接执行的机器码,在这类应用中Java的运行效率很大程度上是取决于即时编译器所输出的代码质量。


HotSpot虚拟机中包含有两个即时编译器:


  • 编译时间较短但输出代码优化程度较低的客户端编译器(简称为C1)
  • 编译耗时长但输出代码优化质量也更高的服务端编译器(简称为C2)


通常它们会在分层编译机制下与解释器互相配合来共同构成HotSpot虚拟机的执行子系统的。



C2即时编译器


Graal编译器是作为C2编译器替代者的角色登场的。C2的历史已经非常长了,可以追溯到Cliff Click大神读博士期间的作品,这个由C++写成的编译器尽管目前依然效果拔群,但已经复杂到连Cliff Click本人都不愿意继续维护的程度。



Graal编译器


而Graal编译器本身就是由Java语言写成,实现时又刻意与C2采用了同一种名为“Sea-of-Nodes”的高级中间表示(High IR)形式,使其能够更容易借鉴C2的优点。


Graal编译器比C2编译器晚了足足二十年面世,有着极其充沛的后发优势,在保持能输出相近质量的编译代码的同时,开发效率和扩展性上都要显著优于C2编译器,这决定了C2编译器中优秀的代码优化技术可以轻易地移植到Graal编译器上,但是反过来Graal编译器中行之有效的优化在C2编译器里实现起来则异常艰难。


这种情况下,Graal的编译效果短短几年间迅速追平了C2,甚至某些测试项中开始逐渐反超C2编译器。


Graal能够做比C2更加复杂的优化:


  • “部分逃逸分析”(Partial Escape Analysis)
  • 比C2更容易使用“激进预测性优化”(Aggressive Speculative Optimization)的策略
  • 支持自定义的预测性假设



未来可期


Graal编译器尚且年幼,还未经过足够多的实践验证,所以仍然带着“实验状态”的标签,需要用开关参数去激活,这让笔者不禁联想起JDK 1.3时代,HotSpot虚拟机刚刚横空出世时的场景,同样也是需要用开关激活,也是作为Classic虚拟机的替代品的一段历史。


Graal编译器未来的前途可期,作为Java虚拟机执行代码的最新引擎,它的持续改进,会同时为HotSpot与Graal VM注入更快更强的驱动力。



编译为原生执行程序


编译为原生程序有一定的假设条件,比如:


  • 尽量少的JNI调用
  • 尽量少的使用反射
  • 尽量少的class loader隔离等


当没有用这些复杂功能的时候,很容易可以使用GraalVM提供的 native image 编译Jar为可执行程序。

当然即使当程序使用了 JNI、反射时,也没关系,我们可以使用一些配置文件告诉GraalVM单独处理这些信息,比如:


  • 通过参数 -H:JNIConfigurationFiles 告诉JNI相关配置JSON文件
  • 通过参数 -H:ReflectionConfigurationFiles 告诉反射相关配置JSON文件


稍微会复杂一些,但是只要有足够的耐心,理论上也是可以编译成功的!

不过我们可以使用一些原生支持GraalVM native image的框架, 比如:Quarkus。



GraalVM的原生编译非常适合微服务和 Serverless


当可以把Java程序也编译为原生的可执行程序后 (目前GraalVM已经支持编译为Windows, MacOS, Linux上的原生程序),最主要的两个变化:


  • 启动时间变短了,之前启动一个有“依赖注入”的Java程序,可能启动时间要2秒以上。如果Java程序是要长期运行的,那启动时间稍慢一点是没问题的,但是对于 Serverless 应用,这就变为冷启动(cold start)了,影响比较大。


  • 程序运行的内存需求变小了,之前启动一个Java程序,控制的好的话(heap设置的比较小),也要100M以上的内存,但是编译为原生程序后,只需要4M内存就可以了。 这样同样的一台机器就可以启动非常多的进程,适合简单的微服务。




参考资料





相关文章
|
2月前
|
监控 算法 Java
Java虚拟机(JVM)的垃圾回收机制深度解析####
本文深入探讨了Java虚拟机(JVM)的垃圾回收机制,旨在揭示其背后的工作原理与优化策略。我们将从垃圾回收的基本概念入手,逐步剖析标记-清除、复制算法、标记-整理等主流垃圾回收算法的原理与实现细节。通过对比不同算法的优缺点及适用场景,为开发者提供优化Java应用性能与内存管理的实践指南。 ####
|
1月前
|
监控 算法 Java
Java虚拟机(JVM)垃圾回收机制深度剖析与优化策略####
本文作为一篇技术性文章,深入探讨了Java虚拟机(JVM)中垃圾回收的工作原理,详细分析了标记-清除、复制算法、标记-压缩及分代收集等主流垃圾回收算法的特点和适用场景。通过实际案例,展示了不同GC(Garbage Collector)算法在应用中的表现差异,并针对大型应用提出了一系列优化策略,包括选择合适的GC算法、调整堆内存大小、并行与并发GC调优等,旨在帮助开发者更好地理解和优化Java应用的性能。 ####
40 0
|
29天前
|
存储 监控 算法
深入探索Java虚拟机(JVM)的内存管理机制
本文旨在为读者提供对Java虚拟机(JVM)内存管理机制的深入理解。通过详细解析JVM的内存结构、垃圾回收算法以及性能优化策略,本文不仅揭示了Java程序高效运行背后的原理,还为开发者提供了优化应用程序性能的实用技巧。不同于常规摘要仅概述文章大意,本文摘要将简要介绍JVM内存管理的关键点,为读者提供一个清晰的学习路线图。
|
1月前
|
存储 监控 算法
Java虚拟机(JVM)垃圾回收机制深度解析与优化策略####
本文旨在深入探讨Java虚拟机(JVM)的垃圾回收机制,揭示其工作原理、常见算法及参数调优方法。通过剖析垃圾回收的生命周期、内存区域划分以及GC日志分析,为开发者提供一套实用的JVM垃圾回收优化指南,助力提升Java应用的性能与稳定性。 ####
|
2月前
|
机器学习/深度学习 监控 算法
Java虚拟机(JVM)的垃圾回收机制深度剖析####
本文深入探讨Java虚拟机(JVM)的垃圾回收机制,揭示其工作原理、常见算法、性能调优策略及未来趋势。通过实例解析,为开发者提供优化Java应用性能的思路与方法。 ####
53 1
|
2月前
|
Oracle 安全 Java
深入理解Java生态:JDK与JVM的区分与协作
Java作为一种广泛使用的编程语言,其生态中有两个核心组件:JDK(Java Development Kit)和JVM(Java Virtual Machine)。本文将深入探讨这两个组件的区别、联系以及它们在Java开发和运行中的作用。
92 1
|
2月前
|
Ubuntu 网络安全 虚拟化
VMware虚拟机ping不通原因排查及分析
下面以 VMware 虚拟机为例进行介绍。
1016 3
|
2月前
|
存储 SQL 数据库
虚拟化数据恢复—Vmware虚拟机误还原快照的数据恢复案例
虚拟化数据恢复环境: 一台虚拟机从物理机迁移到ESXI虚拟化平台,迁移完成后做了一个快照。虚拟机上运行了一个SQL Server数据库,记录了数年的数据。 ESXI虚拟化平台上有数十台虚拟机,EXSI虚拟化平台连接了一台EVA存储,所有的虚拟机都存放在EVA存储上。 虚拟化故障: 工组人员误操作将数年前迁移完成后做的快照还原了,也就意味着虚拟机状态还原到数年前,近几年数据都被删除了。 还原快照相当于删除数据,意味着部分存储空间会被释放。为了不让这部分释放的空间被重用,需要将连接到这台存储的所有虚拟机都关掉,需要将不能长时间宕机的虚拟机迁移到别的EXSI虚拟化平台上。
116 50
|
3月前
|
安全 虚拟化 数据中心
Xshell 连接 VMware虚拟机操作 截图和使用
Xshell 连接 VMware虚拟机操作 截图和使用
83 4
|
3月前
|
Linux 虚拟化
vmware虚拟机安装2024(超详细)
vmware虚拟机安装2024(超详细)
418 6