1.Sun Classic/Exact VM

1996年1月,Sun公司发布JDK 1.0,Java语言首次拥有了商用的正式运行环境,这个 JDK中所带的虚拟机就是Classic VM。这款虚拟机只能使用纯解释器方式来执行Java代码,如果要使用JIT编译器,就必须进行外挂。但是假如外挂了JIT编译器,JIT编译器就完全接管 了虚拟机的执行系统,解释器便不再工作了。  由于解释器和编译器不能配合工作,这就意味着如果要使用编译器执行,编译器 就不得不对每一个方法、每一行代码都进行编译,而无论它们执行的频率是否具有编译的价 值。基于程序响应时间的压力,这些编译器根本不敢应用编译耗时稍高的优化技术,因此这 个阶段的虚拟机即使用了JIT编译器输出本地代码,执行效率也和传统的C/C++程序有很大差 距;

为了解决Classic VM所面临的各种问题,提升运行效率。在JDK 1.2 时,曾在Solaris平台上发布过一款名为Exact VM的虚拟机,它的执行系统已经具备现代高性 能虚拟机的雏形:如两级即时编译器、编译器与解释器混合工作模式等。Exact VM因它使用 准确式内存管理(Exact Memory Management,也可以叫Non-Conservative/Accurate Memory Management)而得名,即虚拟机可以知道内存中某个位置的数据具体是什么类型。譬如内存 中有一个32位的整数123456,它到底是一个reference类型指向123456的内存地址还是一个数 值为123456的整数,虚拟机将有能力分辨出来,这样才能在GC(垃圾收集)的时候准确判 断堆上的数据是否还可能被使用。由于使用了准确式内存管理,Exact VM可以抛弃以前 Classic VM基于handler的对象查找方式(原因是进行GC后对象将可能会被移动位置,如果将 地址为123456的对象移动到654321,在没有明确信息表明内存中哪些数据是reference的前提 下,虚拟机是不敢把内存中所有为123456的值改成654321的,所以要使用句柄来保持 reference值的稳定),这样每次定位对象都少了一次间接查找的开销,提升执行性能。

虽然Exact VM的技术相对Classic VM来说先进了许多,但是在商业应用上只存在了很短 暂的时间就被更为优秀的HotSpot VM所取代,而Classic VM的生命周期则相对长了许多,它在JDK 1.2之前是Sun JDK中唯一 的虚拟机,在JDK 1.2时,它与HotSpot VM并存,但默认使用的是Classic VM(用户可用javahotspot参数切换至HotSpot VM),而在JDK 1.3时,HotSpot VM成为默认虚拟机,但Classic VM仍作为虚拟机的“备用选择”发布(使用java-classic参数切换),直到JDK 1.4的时 候,Classic VM才完全退出商用虚拟机的历史舞台;

2.Sun HotSpot VM

 Sun HotSpot VM是Sun JDK和OpenJDK中所带的虚拟 机,也是目前使用范围最广的Java虚拟机。 HotSpot VM既继承了Sun之前两款商用虚拟机的优点(如前面提到的准确式内存管理), 也有许多自己新的技术优势,如它名称中的HotSpot指的就是它的热点代码探测技术(其实两个VM基本上是同时期的独立产品,HotSpot还稍早一些,HotSpot一开始就是准确式GC,而Exact  VM之中也有与HotSpot几乎一样的热点探测。)

HotSpot VM的热点代码探测能力可以通过执行计数器找出最具有编译价值的代码,然后通知JIT编译器以方法为单位进行编译。如果一个方法被频繁调用,或方法中有效循环次数很多,将会分别触发标准编译和OSR(栈上替换)编译动作。通过编译器与解释器恰当地协同工作,可以在最优化的程序响应时间与最佳执行性能中取得平衡,而且无须等待
本地代码输出才能执行程序,即时编译的时间压力也相对减小,这样有助于引入更多的代码优化技术,输出质量更高的本地代码。

在2006年的JavaOne大会上,Sun公司宣布最终会把Java开源,并在随后的一年,陆续将JDK的各个部分(其中当然也包括了HotSpot VM)在GPL协议下公开了源码,并在此基础上建立了OpenJDK。这样,HotSpot VM便成为了Sun JDK和OpenJDK两个实现极度接近的JDK项目的共同虚拟机。在2008年和2009年,Oracle公司分别收购了BEA公司和Sun公司,这样Oracle就同时拥有了两款优秀的Java虚拟机:JRockit VM和HotSpot VM。

3.其他的虚拟机

1.Sun其他虚拟机

Sun Mobile-Embedded VM/Meta-Circular VM
 1.KVM(Kilobyte)
 2.CDC/CLDC HotSpot Implementation(Connected(Limited)Device Configuration)
 3.Squawk VM
 4.JavaInJava
 5.Maxine VM 
2.其他组织的虚拟机
 BEA JRockit/IBM J9 VM(IBM公司) 
 Azul VM/BEA Liquid VM
 Apache Harmony/Google Android Dalvik VM
 Microsoft JVM