百家争鸣的Java虚拟机

        Java虚拟机是Java代码运行的容器,Java程序编译后的字节码文件需要经过虚拟机的解释才能被机器所识别,其重要性不言而喻,那么市面上都有哪些虚拟机的存在?

1.Sun Classic VM

        1996年1月23日,Sun公司发布了JDK1.0,Java语言首次拥有了商用的正式运行环境,就是Classic VM,这款虚拟机只能以纯粹的解释器方式来执行字节码文件,想要使用即时编译器的话,则需要进行外挂,但是外挂即时编译器后,即时编译器就将完全接管虚拟机的执行系统,将导致解释器不再工作,因此无法进行搭配,后果就是如果非要用编译执行的话,编译器需要对每一行代码都进行编译,同时基于编译程序响应时间的压力,编译器不敢应用编译耗时稍高的优化技术,因此此时的即时编译器输出的本地代码与传统的C/C++程序依然有较大差距,“Java语言很慢”的刻板印象也是从这个时候开始的。

2.Exact VM

        Classic VM存在的许多问题Sun公司自然是知道的,因此官方团队努力去解决这些问题,提升运行效率,于是到了JDK1.2的时代,曾在Solaris平台发布过一款Exact VM,他的编译执行系统已经具备现代高性能虚拟机的雏形,已经引入了热点探测、两集即时编译器、编译器与解释器混合工作等技术了。但Exact VM大概是生不逢时吧,还没来得及发布Windows与Linux平台的商用版本,就被外部引入的HotSpot VM所取代。

3.HotSpot VM

        这大概是最广为人知的Java虚拟机了,他是Sun/OracleJDK和OpenJDK的默认虚拟机,也是目前使用最广泛的Java虚拟机,但不一定所有人都知道的是,HotSpot VM一开始并不是由Sun公司开发的,而是一家名为"Longview Technologies"的小公司设计得,甚至这个虚拟机最初并不是为Java语言所设计得,他来源于Strongtalk虚拟机,Strongtalk的很多技术其实是来源于一款为了支持Self语言实现“达到C语言50%以上的执行效率”的目标而设计得Self虚拟机;Sun公司意识到这款虚拟机的许多优势,于是在1997年收购了该公司,从而获得了HotSpot VM。

        后面HotSpot经过很长时间的发展,更得益于Sun/OracleJDK在Java应用中的统治地位,HotSpot理所当然的成为了世界上应用最广泛的Java虚拟机,堪称是虚拟机家族中的“武林盟主”。

        HotSpot VM含有两个即时编译器,分别是编译耗时端但输出代码优化程度较低的C1(客户端编译器),以及编译耗时较长但输出代码优化程度较高的C2(服务端编译器),通常他们会在分层编译机制下与解释器共同协作来构成HotSpot的执行子系统。

        HotSpot VM自JDK10起,加入了一个全新的即时编译器:Graal编译器。该编译器的历史使命是取代原来的C2编译器,但由于Graal编译器目前尚处于年幼时期,未经过足够多的实践验证,因此仍然带着“实验状态”的标签,需要参数才能激活使用。

4.Mobile/Embedded VM

        Sun/Oracle公司研发的虚拟机不仅有面向服务器/桌面领域的,面对移动和嵌入式市场,也有相对应的虚拟机产品。

        Java ME相对Java SE并不那么成功,因此Java ME的虚拟机也比HotSpot低调得多。主要原因是Java ME的虚拟机现在的处境比较尴尬,因为市面上的智能手机已经被Android与iOS二分天下,因此该虚拟机在这种情况下就显得用处不大。

        至于嵌入式设备商,Java ME Embedded又面临着自驾Java SE Embedded的直接侵蚀,在能用到Java SE的地方自然大家都不愿意使用Java ME了,因此市场也在萎缩,也就显得并不那么优越。

5.BEA JRockit

        JRockit VM 是由BEA System公司在2002年从Appeal Virtual Machines公司收购得到的Java虚拟机,曾经号称是“世界上速度最快的Java虚拟机”。

        BEA将其发展成一款专门为服务器硬件和服务端应用场景高度优化的虚拟机,专注于服务端应用,并不太关注程序启动速度,因此JRockit VM内部并没有解释器的实现,所有的代码都靠即时编译器编译后执行。此外,当时的JRockit的垃圾收集器和故障处理套装的实现在当时也处于领先水平,后面随着BEA被Oracle收购,JRockit VM也就永远停留在R28版本。

6.IBM J9 VM

        IBM J9并不是IBM公司唯一的Java虚拟机,不过目前IBM主力发展的就是这个J9。与BEA JRockit值专注于服务端应用不同的是,J9走的路线与HotSpot较为相似,它是一款在设计上全面考虑服务端、桌面应用、嵌入式的多用途的虚拟机。

        J9直到今天依然非常活跃,并且IBM J9虚拟机的职责分离与模块化做的比HotSpot更好,由J9 VM中抽象封装出来的核心组件库(包括垃圾收集器、即时编译器、诊断监控子系统等)就构成了IBM OMR项目,可以在其他语言平台如Ruby、Python中快速组装成相应功能。

        自2016年起,IBM逐步将OMR项目和J9 VM进行开源,完全开源后便将他们捐献给了Eclipse基金会管理,并重新命名为Eclipse OMR和OpenJ9.

7.BEA Liquid VM/Azul VM

        我们厂提到的“高性能Java虚拟机”一把指HotSpot、J9这类在通用硬件平台上运行的商用虚拟机,此外,还有一类与特殊硬件平台绑定、软硬件配合工作的专有虚拟机,他们可能在特殊的环境下能够实现更高的执行性能,或者提供某些特殊的功能特性,其中为代表的是BEA Liquid VM和Azul VM。

        Liquid VM与JRockit同属一家公司开发,因此Liquid VM也被称为JRockit VE(Virtual Edition),他可以直接运行在Hypervisor系统上的虚拟机版本,Liquid VM不需要操作系统的支持即可运行,或者说他身本上线了一个专用操作系统的例如线程调度、文件系统、网络支持等的必要功能,脱离了操作系统,也就意味着他不需要进行内核态/用户态的切换,可以最大限度发挥硬件的能力,提升Java程序的执行性能。

        随着JRockit的终止,Liquid VM也停止了,可能也有些可惜吧。

        Azul VM是Azul Systems公司在HotSpot基础上进行大量改进,运行于Azul Systems公司的专有硬件Vega系统上的Java虚拟机。从2010年起,Azul公司的重心逐渐从硬件转向软件,发布了自己的Zing虚拟机,同时由于商业上的缺陷,专有虚拟机逐渐没落,Vega产品线被Azul公司放弃了,Azul VM下场不言而喻。

8.Google Android Dalvik VM

        严格来说,Dalvik不能称为Java虚拟机,而应该称为虚拟机,这款虚拟机背后的技术曾经对Java世界产生了强大的影响跟冲击。

        经典的HotSpot VM是一款栈架构的虚拟机,但Dalvik不同,他是一款寄存器架构的虚拟机,他并没有遵循《Java虚拟机规范》,因此不能够直接执行Java的字节码文件,但他与Java又有着千丝万缕的关系,他执行的DEX(Dalvik Executable)文件可以由字节码文件转化而来,可以使用Java语法来编写程序,直接使用绝大部分的Java API,在Android2.2时代,Dalvik开始提供即时编译器的实现,性能进一步提高,但到了Android4.4时代,支持提前编译(Ahead Of Time Compilation,AOT)的ART虚拟机的崛起,在当时性能害不算特别强大的移动设备上,提前编译比即时编译更容易获得高性能,因此到了Anroid5.0时代,即时编译器被全面替换成了ART虚拟机。

9.Microsoft JVM

        可能很多人不知道的是,微软曾经业开发过一款Java虚拟机。

        在Java语言诞生的初期(1996年-1998年,以JDK1.2发布前为分界线),它的主要作用之一是在浏览器中运行Java Applets程序,微软为了在亲儿子Internet Explorer 3中支持Java Applets应用而开发了自己的Java虚拟机,尽管这款虚拟机只有Windows版本,但却是当时Windows系统下性能最好的Java虚拟机。好景不长,1997年10月,Sun公司以侵犯商标、不正当竞争等罪名一状子将微软告上法庭,结果就是微软公司赔偿2000万美金,并承诺终止自家的Java虚拟机的发展,逐步在产品中移除Java虚拟机的相关功能。(如果当年微软能够继续保持对Java技术的热情,.Net技术还会出现吗)

10.KVM

        KVM的K是Kilobyte的意思,他强调简单、轻量、高度可移植,但运行效率较差。在Android、iOS等职能手机操作系统出现前曾在手机平台得到非常广泛的应用

11.Java Card VM

        JCVM是Java虚拟机很小的一个子集,裁减了许多模块但通常支持绝大多数的常用加密算法。JCVM必须精简到能够放入智能卡、SIM卡、银行信用卡、借记卡内,负责对Java Applets程序进行解释执行。

12.Squawk VM

        Squawk VM 是由Sun公司开发,运行于Sun SPOT(一种手持的Wi-Fi设备),也曾经运用于Java Card。这是一个Java代码币种很高的嵌入式虚拟机实现,除了设备I/O与一些必要的本地代码是用C语言实现的外,其余部分全部由Java语言完成。

13.JavaInJava

        JavaInJava是Sun公司在1997-1998年间研发的一个实验室性质的虚拟机,他试图以Java语言来实现Java语言本身的运行环境,就是我们所说的“元循环”虚拟机。他必须运行在另外一个宿主虚拟机之上,内部没有即时编译器,代码只能通过解释器运行,所以性能上可想而知,但一门语言可以自举达成元循环,是他的研究意义所在。

14.Maxine VM

        Maxine VM 与JavaInJava类似,也是一个几乎全部以Java代码实现的元循环Java虚拟机。

        这个项目从2005年开始,直到今天依然在发展之中,相对于JavaInJava,Maxine VM有着先进的即时编译器跟垃圾回收器,可在宿主模式或者独立运行,效率已经接近HotSpot虚拟机的Client水平,后来有了Graal编译器的加持,更是如虎添翼,效率有了进一步的飞跃。

15.Jikes RVM

        Jikes RVM是IBM开发的专门用于研究Java虚拟机实现技术的项目,与JavaInJava一样,他是一个元循环虚拟机。

16.Taobao JVM

        讲了这么多国外研究开发的虚拟机,那么国内是否也有相应的技术研发呢?

        Taobao JVM是阿里巴巴公司基于OpenJDK项目进行优化、定制且开源的服务器版Java虚拟机,目前已经在淘宝、天猫上线,全面替换了OracleJVM,在性能上、功能上都初步体现了他的价值,但以后会如何发展,还需要时间的进一步考验。

17.其他虚拟机

        除了以上的虚拟机外,还有很多没被介绍到的虚拟机,这里做一些枚举,但不包含全部。

  •  IKVM.NET
  • JamVM
  • CacaoVM
  • SableVM
  • Kaffe
  • Jelatine JVM
  • NanoVM
  • MRP
  • Moxie

以上内容借鉴《深入理解Java虚拟机》周志明版

本人学习该书籍的同时也顺手自己尝试用Java语言写了一个虚拟机Demo,各位看官如有兴趣不妨移步MyJVM

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值