小白必看,Java虚拟机的历史

虚拟机始祖:Sun Classic


1996年1月23日,Sun发布了JDK 1.0,带有自己的虚拟机Classic VM。然而,该虚拟机具有仅使用纯解释器来执行Java代码的特性。如果要使用JIT编译器,则必须使用插件。

提示:执行代码可以分为编译执行和解释执行。解释执行指的是在解释时运行代码。编译执行是指在执行之前的编译。

但是如果插入了JIT编译器,JIT编译器将完全替换虚拟机的执行系统,并且解释器将不再工作。简单地说,在Sun Classic虚拟机中,解释器和编译器不能共存。

即使使用插件JIT编译器,Sun Classic虚拟机的执行速度也不够快。由于解释器无法与编译器一起工作,因此虚拟机无法判断哪个方法被频繁使用,因此只能编译每个方法。这导致虚拟机只能采用相对简单的优化技术,不能进行稍高耗时的优化技术。因为如果将耗时的优化技术应用于所有代码,那么编译时间将非常慢。

虽然Sun经典虚拟机存在这样那样的问题,但是它的生命力仍然很强。在JDK 1.3之前,它是JDK的默认虚拟机。在JDK 1.3中,HotSpot成为默认虚拟机,并作为备用虚拟机存在。到了JDK 1.4,它正式退出了历史舞台。可以说,Sun Classic已经存在了将近四年,但是另一个虚拟机并不那么幸运。

无疾而终:Sun Exact VM


在Sun Classic发布之后,Sun的虚拟机团队在JDK 1.2发布了一个名为Exact VM的虚拟机,试图解决Classic VM遇到的所有问题。它的执行系统解决了经典VM的解释器和编译器不能同时工作的问题。它还具有现代高性能处理器的一些特点,如两级即时编译。

此外,Exact VM还改进了虚拟机的对象查找。在经典VM中,如果您想要找到对象,您需要通过句柄(类似于指针)来找到它。如果需要搜索对象,则需要通过它所构建的句柄树逐层搜索它。但是,在Exact VM中使用了精确内存管理,即虚拟机可以准确地知道内存中数据的类型,从而降低了搜索成本,提高了执行性能。

不幸的是,虽然ExactVM已经发布,但它直到退出后才真正大规模使用。当发布JDK 1.2时,启动了精确的VM,但Sun经典VM仍然是默认的Java虚拟机。当JDK 1.3发布时,虚拟机HotSpot VM被引入作为默认虚拟机,Sun Classic VM被引入作为备用虚拟机。

武林盟主:Sun HotSpot VM


热点VM可以说是最广泛使用的Java虚拟机,它几乎为所有Java虚拟机所知。但实际上,虚拟机不是由Sun开发的,而是由Longview Technologies开发的。Sun注意到JIT编译中的许多优秀结果,于1997年收购了Longview Technologies,并收购了HotSpot VM。

HotSpot不仅具有上述两台虚拟机(如精确的内存管理)的优点,还具有热点检测等许多新技术。热点检测技术是指通过执行计数器,找出最有价值的代码,然后通知JIT编译器在方法上进行深入的优化。但是Exact VM中也有类似的技术,Sun内部也有很大的争议,但是为什么选择HotSpot作为默认虚拟机还不清楚。

总的来说,自2000年发布JDK 1.3以来,HotSpot VM一直作为默认虚拟机处于历史阶段。现在,2018年,18年过去了,它仍然是我们最常用的虚拟机,它显示了Sun HotSpot VM的韧性。

百家争鸣:BEA JRockit / IBM J9 VM


所有这些都是Sun公司推出的虚拟机,但是除了Sun公司,其他组织和公司也开发了许多虚拟机实现,其中最著名的是BEA JRockit和IBM J9 VM。

BEA的JRockit是一个专注于服务器硬件和服务器应用程序场景的虚拟机。它对服务器场景做了很多优化,因此它不太关注程序启动速度。JRockit虚拟机不包含解释器实现,所有代码都由即时编译器编译和执行。此外,它的任务控制服务套件也非常强大。

IBM的J9 VM是一个更通用的虚拟机,它被定位为应用于从服务器到桌面应用程序到嵌入式系统的多用途虚拟机。IBM开发J9VM作为IBM各种Java产品的执行平台。

武林外传:那些无名虚拟机


最后

各位读者,由于本篇幅度过长,为了避免影响阅读体验,下面我就大概概括了整理了,需要的话请**点赞后点击这里免费下载文章资料!**

小白必看,Java虚拟机的历史

小白必看,Java虚拟机的历史

小白必看,Java虚拟机的历史

76202)]

[外链图片转存中…(img-aM4UpoaI-1628320276205)]

[外链图片转存中…(img-nRS5PAsN-1628320276206)]

小白必看,Java虚拟机的历史

上一篇:错误: 程序包com.sun.xml.internal.bind.v2.model.core不存在


下一篇:java.lang.NoClassDefFoundError: sun/swing/plaf/synth/SynthIcon