Java虚拟机--虚拟机发展史

Java虚拟机介绍

上一节中,我们介绍了Java的发展历史,从Java1.0说到了Java1.9,从1995年说到了2017年,在这20余年的发展过程中,Java在全世界得到了广泛普及,成为了世界上使用人数最多的编程语言。

值得表明的是,Java的高速发展离不开底层技术的支持,离不开Java的核心--虚拟机。在这20多年的发展中,Java虚拟机也随着Java的版本不断的迭代,更新。

从1996年初,Sun公司发布的Java1.0开始,虚拟机就走进了历史的舞台。在发展的过程中,有的虚拟机一经出现便得到众多关注,有的虚拟机时运不济诞生没多久便早早夭折。

在这一节中,我们一起来回顾下Java虚拟机家族的发展轨迹和历史变迁。

Sun Classic VM

1996年1月23日Sun公司发布了JDK1.0,并推出了世界上第一款商用Java虚拟机---Sun Classic VM。不过,该款虚拟机只能使用纯解释器的方式来执行Java代码,如果需要使用JIT(即时编译器Just In Time Compiler),就必须进行外挂操作。但是,如果外挂了JIT(即时编译器Just In Time Compiler),解释器就不会在起作用了,JIT(即时编译器Just In Time Compiler)会完全接管了虚拟机的执行。 悲剧的是,如果JIT(即时编译器Just In Time Compiler)完全接管了虚拟机,将会导致整个Java程序的执行效率大大降低。

“Java语言执行慢“就是在此时树立起来的,怪我虚拟机咯?

为什么说,JIT会导致Java程序执行效率大大降低呢?因为JIT会对程序中的每一个方法、每一行代码进行编译,在程序执行时候每执行一个方法就会进行一次编译,那么可想而知,如果碰到编译耗时较高的代码,对于程序的执行简直就是灾难,想必没有人会忍受如此之慢的程序。

什么是解释器,什么是编译器,什么是JIT?

Java编译器:虚拟机将源代码(.java文件)编译成一种中间的字节码(.class文件),这种字节码就是JVM所能看懂的语言,这与平台无关,这也是Java能跨平台操作的核心,拿着.class文件在任何平台都可以运行。

Java解释器:用来解释执行Java编译器编译后的字节码文件,把字节码转化为特定平台所能看懂的机器码并运行。编译后的字节码文件一行一行解释运行,解释器不会一次把整个程序翻译出来,而是每解释一行代码就运行一次,然后再翻译下一行,再运行,如此不停地进行下去。因此解释器的程序运行速度比较缓慢。

即时编译(Just-in-time compilation: JIT):又叫实时编译、及时编译,是指一种在Java程序运行时将字节码编译成平台所能看懂的原生机器码技术,并且会将翻译过的机器码缓存起来以便下次执行时候,直接使用,提高程序的性能,这项技术是被用来改善虚拟机执行效率的。此外,JIT只会对经常执行的字节码进行编译。

虚拟机特点

Java语言的一个非常重要的特点就是与平台的无关性,而Java虚拟机是实现这一特点的关键。一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码,而引入Java虚拟机后,Java语言在不同平台上运行时不需要重新编译。所以可以实现,一次编译到处运行。

Java虚拟机屏蔽了与具体平台相关的信息,使得Java编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多平台上不加修改地运行。Java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令进行执行。

image

Exact VM

Sun Classic VM的诞生,为Java提供了更为广阔的发展空间,但是Sun Classic VM也存在这致命的缺陷。

为了解决Sun Classic VM所面临的效率问题,Sun公司在Java1.2时候发布了名为Exact VM的虚拟机,这款虚拟机的执行系统采用的是两级即时编译器、编译器和解释器混合工作模式等,同时Exact VM采用准确式内存管理,也就是说虚拟机知道内存中的某个位置上的数据是什么类型的,例如说:这个位置是一个数字123的reference类型,还是就是数字123。有了这样的功能后,虚拟机在垃圾收集时就可以准确的判断出这些数据是否可用,继而大大提高了垃圾回收的效率。

虽然Exact VM在技术上比Sun Classic VM先进了许多,但不幸的是,没诞生多久就被后来更为优秀的HotSpot VM所取代,早早夭折了。甚至还没有发布windows和linux平台下的商用版本。

Sun HotSpot VM

说起Sun HotSpot VM,想必所有Java程序员都应该知道。当我们在命令窗口使用java -version命令时,会出现如下输出:

image

其中,Java HotSpot(TM) 64-Bit Server VM就是我们当前Java版本中所默认的虚拟机。也就是本小节的主角--Sun HotSpot VM。

HotSpot VM最初并非Sun公司开发的,而是由一家名为“Longview Technologies”的小公司设计的,而且这款虚拟机一开始也不是为Java语言开发的。

不过,在当时HotSpot VM这款虚拟机在JIT编译技术上拥有许多优秀的理念,于是Sun公司在1997年收购了Longview Technologies,并获得了HotSpot VM。

正所谓人如其名,Sun HotSpot VM不但继承了之前两款Sun Classic VM、Exact VM虚拟机的特点,还有很多自己的特征。通过名字便可看出,HotSpot--热点,即热点代码探测技术。

我们之前说了,在Sun Classic VM时,如果如果外挂了JIT,解释器就不会在起作用了,JIT会完全接管了虚拟机的执行,在运行时期会对每一行代码进行编译,大大影响程序的执行效率。

当Sun HotSpot VM出现后,这一情况逐渐被改善。HotSpot VM所拥有的热点代码探测技术,会对方法的执行进行统计。当一个方法被多次执行时,HotSpot VM就会将该方法交给JIT,让JIT对其进行编译,并将编译后的机器码缓存起来,以供下一次调用。通过不断的优化,Java程序的执行效率得到了很大提升。

HotSpot VM所拥有的热点代码探测技术,是通过执行计数器来实现的。主要是对每个方法建立计数器,统计方法的执行次数,如果执行次数超过了一定的阀值,虚拟机就认定其是热点方法。

值得注意的是,这里统计的执行次数,是指在一定时间内的执行次数,我们称之为频率。当超过规定的时间后,方法的调用次数如果达不到热点代码的要求,那么该方法的调用次数就会进行热度衰减,次数的值将会变为原来的一半。

2006年,JavaOne大会,Sun公司宣布将Java进行开源,并在GPL协议下公开了源码,在此基础上建立了OpenJDK(大部分内容与Sun Java一致)。而Sun HotSpot VM也就成为了Sun JDK 和 OpenJDK的公共虚拟机。

在Java1.3时,HotSpot VM成为了Java默认的虚拟机(不幸的Exact VM早已被打入冷宫,据说在Sun公司内部还进行了激烈的讨论,到底是选择HotSpot VM还是Exact VM)。有趣的是,第一代商用虚拟机Classic VM在Java1.0、Java1.1、Java1.2时仍是首选默认,在Java1.3时成为了HotSpot VM的备份,直到Java1.4时完全退出虚拟机的历史舞台。

BEA JRockit

除了Sun公司以外,其他组织、公司也研发出不少虚拟机实现,下面我们就来一一介绍。

BEA JRockit曾号称是“世界上速度最快的Java虚拟机”,是BEA公司在2002年从Appeal Virtual Machines公司收购得来的。有意思的是,Oracle后面又把BEA公司收购了。所以JRockit现在隶属于Oracle;

说到BEA大家可能不太熟悉,但是如果问到weblogic,想必许多人都听说过。没错,weblogic就是BEA公司的一个重量级产品,与tomcat一样,也是一个开发、集成、部署和管理大型分布式Web应用、网络应用和数据库应用的Java应用服务器。最早由一个小公司开发,后来被BEA公司收购。

与其他的虚拟机不同的是,BEA JRockit旨在驱动要求极高的服务器端Java应用,以便为企业应用提供极高的性能、可管理性和可靠性。

在BEA收购JRockit之后,BEA公司将其发展成一款专门为服务器硬件和服务器端应用场景高度优化的虚拟机,说直白点,就是该虚拟机对于特定场景的应用更合适,例如高并发,进行了一些深度的优化操作,执行速度上远远超过HotSpot VM.

值得一提的是,JRockit还是一个专门针对于Intel处理器进行优化的JVM,BEA JRockit采用了最先进的优化技术,能在Intel处理器上获得最高的性能,其中包括支持64位的英特尔至强和英特尔安腾处理器。

JRockit使用了自适应的优化编译器,以加速字节代码的执行。内部功能如线程同步、对象分配、数组复制和文件/网络通信均针对速度进行了优化。

不幸的是,由于Oracle后面即收购了BEA公司,也收购了Sun公司,所以在Java SE虚拟机的选择上,BEA也成为了炮灰,只有HotSpot VM一家独大了。JRockit最后发布的大版本是R28,只支持到了Java1.6,原本在开发中的R29及JDK7的对应功能都没来得及完成项目就被终止了。

可以吹吹牛逼的是,在曾经的Java SE主流虚拟机中,Rockit跟HotSpot与J9一起并称三大主流JVM。

IBM J9 VM

IBM最初研发了多款Java虚拟机,不幸的是,经过多年的发展,许多虚拟机不是被合并就是被淘汰了。现在主推的就是我们本小节要介绍的IBM J9虚拟机。

IBM J9是IBM开发的一个高度模块化的JVM。

与JRockit不同,IBM J9的市场定位与Sun HotSpot VM类似,是一款从服务器端到桌面应用再到嵌入式等场景都涉及的虚拟机,但是,在中国IBM J9的普及程度远不及HotSpot 或JRockit。

由于IBM自身发展问题,IBM J9至今连一份完整的中文文档都很难找到。关于IBM J9的大部分信息,很多都是在其IBM内部平台上进行共享,直接对外公布的相对较少。

并且,在Window上IBM与Oracle有协议,IBM不能再Window平台上单独发布IBM J9虚拟机。如果想要使用IBM J9,那么就得使用IBM的相关产品,因为这些产品中都或多或少的绑定了IBM J9虚拟机,例如:WAS、Rational系列的产品,又或者Lotus系列的产品。

在2017年9月份,IBM曾宣布开源IBM J9虚拟机,并命名为OpenJ9,已将该项目托管至GitHub,OpenJ9 已贡献给Eclipse基金会。

对于IBM为什么将他们的J9虚拟机贡献给Eclipse基金会的问题,IBM 这样回应:IBM公开承诺要将创新带入开源社区。OpenJ9虚拟机本身是基于 Eclipse OMR项目的核心技术组件,OMR由IBM在2016年贡献给Eclipse基金会。IBM 一直在持续将资源投入到 Eclipse OpenJ9 和 Eclipse OMR 中,以确保其企业产品能够利用最新的硬体技术。」

Azul VM

Azul VM是Azul System公司在Sun HotSpot VM基础上进行大量改进后的产品,运行在Azul System公司专有Vega平台上。Vega是Azul System公司主打的硬件/软件的混合解决方案。Vega中使用的是自行设计的Vega/TXU CPU,定制的内存和主板,自行研发的操作系统,所以说是一个软硬结合的混合解决方案。

重要的是,每个Azul VM可以管理数十个CPU和数百GB内存的硬件资源,可不可怕。更为关键的是,在如此大的内存下,Azul VM还能可控的GC时间的垃圾收集器。

Vega于2005年首次投向市场。到2009服务器硬件市场疲软后,Azul转向研发Azul Zing虚拟机,于2010年发布,而Vega硬件设计部门最终就解散了。

Azul Zing VM

在Vega平台发展不利的情况下,Azul在2010年发布了Java虚拟机---Zing VM。Azul Zing JVM是在HotSopt VM上做了不少的定制以及优化工作,改进了许多会影响延迟的细节。

Azul Zing JVM主打低延迟、高实时服务器端JDK市场,最大的卖点是:(1) 低延迟、“无暂停”(pauseless)的C4 GC,GC带来的暂停可以控制在10ms以下的级别,支持的Java堆大小可以到1TB。(2) 启动后快速预热功能,“ReadyNow!”。(3) 可管理性:整合在JVM内的监控工具Zing Vision。Azul Zing并不单纯拥有虚拟机,如果算上Zing System Tools的话,Azul Zing是一套纯软件解决方案,并且可以运行在Linux、x86-64平台上。

Zing JVM发行版同样包括了产品应用可视化工具,称做Zing Vision,它提供了以一套工具用实时获取故障程序的信息。在5.2版本有一些功能上的增强,例如在安全的时刻去收集更多的垃圾回收统计数据。

Azul Zing VM基于Sun HotSpot VM,针对Linux和x86平台进行了优化。Azul Zing VM 5.2版本支持以下Linux发行版:

Red Hat Enterprise Linux (5.2以上, 6.x)
SUSE Linux Enterprise Server (SLES 11 sp1和sp2)
CentOS (5.2以上, 6.x)
Ubuntu Linux (10.04 LTS, 12.04 LTS) -Zing 5.2版本新支持的平台

Microsoft JVM

微软曾经也是Java技术的铁杆支持者,可惜Sun公司在2000年左右以侵犯商标、不正当竞争等罪名起诉微软。最终,Sun公司胜诉,微软赔偿Sun公司10亿美元,并承诺永久停止Microsoft JVM的发展,并逐步在微软产品中移除Microsoft JVM相关功能。在Window XP SP3版本中,Microsoft JVM的内容被全部抹去。

Sun公司当时为什么要这么做?主要原因还是Sun公司和微软形成了竞争关系,并且此竞争关系威胁到了Sun公司的地位。而微软的目的也很直接,就是与Sun公司争夺Java的控制权,使得Java从跨平台技术变为绑定在Windows上的技术。或许,Sun公司当时也是被逼无奈。

在Java语言诞生初期,Java主要的应用就是在浏览器中运行,微软为了在浏览器中支持Java程序,便开发了自己的虚拟机产品,当然这款产品只有Windows平台版本。不过,由于微软强大的研发实力,在当时Microsoft JVM可是性能最好的虚拟机。可是好景不长,Sun公司于1997年10月提起了诉讼。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Android知识点总结

01--Java核心之JVM引入篇

虚拟机即:虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的 JVM只是一种用于计算设备的规范,广义来说相当于一个接口,而接口的实现可以不...

9730
来自专栏程序人生 阅读快乐

Linux Shell编程与编辑器使用详解

本书由浅入深,全面、系统地介绍了Linux技术,书中提供了大量实例,供读者实战演练。另外,本书有很多关于Linux下的命令操作内容,所以对于每个命令、每个管理设...

12610
来自专栏Java社区

粉丝福利 |超1000套项目源码及其他编程资源分享

29730
来自专栏编程

32行代码实现微信聊天机器人

在智能手机无所不能的今天,聊天机器人大家并不陌生。语音、文字的,随口都能说出几个。记得最早火起来的,当属人人网上的小黄鸡了吧,那个@小黄鸡风靡一时的时代,如今...

66250
来自专栏Bug生活2048

如何培养良好的编程习惯?

首先你的项目结构要清晰,养成良好的文档结构分类习惯是很有必要的,举个最简单的web网站项目。

26020
来自专栏程序员互动联盟

【一起学python系列】--python发展史

Python的创始人吉多·范罗苏姆(Guido van Rossum),在1989年12月的圣诞节期间,为了打发时间,决定开发一种新的脚本解释程序,作为ABC语...

40180
来自专栏程序员互动联盟

自学编程该如何入手?

光讲如何如何怎样怎样学习编程,都不是真正从零开始,针对的都是懂一些语言,有一点语言基础的人。对于一点都不懂的人有点残忍。大多数人都有自学编程的激情,但是如何才...

46190
来自专栏编程

6本PHP必备书籍,你值得拥有

PHP(Hypertext Preprocessor,中文名:“超文本预处理器”)是一种通用开源脚本语言。语法吸收了C语言、Java和Perl的特点,利于学习,...

24960
来自专栏ThoughtWorks

谈谈命名|TW洞见

今日洞见 文章作者、部分图片来自ThoughtWorks:黄博文。本文封面来自网络。 本文所有内容,包括文字、图片和音视频资料,版权均属ThoughtWorks...

372100
来自专栏新智元

网易有道CEO周枫:Go语言继承了C语言的灵活简单

来源:周枫 转载编辑:常佩琦 【新智元导读】网易有道CEO周枫推荐Go语言。他认为Go很好地继承了C语言灵活、简单有效的思想;Go有很高的生产效率;Go精选了一...

402120

扫码关注云+社区

领取腾讯云代金券