1.5 JVM的进化发展史

本节对Java领域的技术广度进行扩展,重点介绍Java虚拟机(JVM)的进化发展史。

1.5.1 虚拟机之祖:Sun Classic和Exact VM

虚拟机之祖Sun Classic是历史上第一个JVM,是JVM发展历史的开端之作。虽然其采用的技术在如今而言已经过时了,但是它的地位无可撼动。

Classic VM在1996年1月发布,它只能通过解释指令方式执行Class字节码,如果需要JIT编译器,只能通过外部挂载,直到JDK 1.1发布内部才增加了JIT(即时编译)。此外Classic VM的核心类库也不是很完整,执行指令的性能和速度与C或者C++的差距也很大。

正是由于Classic VM存在着如此多的问题,因此Sun研发团队在Solaris系统平台上又推出了一个优化版的虚拟机器,名为Exact VM。尽管Exact VM在跨平台性方面还存在诸多局限性,不过它的执行效果和性能都已经大幅改善了,如两级即时编译器体系及解释器加编译者的混合执行模式。需注意Exact VM的对象定位方式采用的是句柄池的引用方式,而不是直接定位。但是,还没等到Exact VM开疆拓土,更加优秀的虚拟机诞生了,那就是HotSpot VM。

在JDK 1.3之前Classic VM都是默认JVM,在JDK 1.4发布后,虚拟机之祖Classic VM正式宣布“退役”。

1.5.2 HotSpot VM

JVM历史上最重要一个里程碑就是HotSpot VM的诞生,其于1999年由Sun公司旗下的Longview Technologies公司开发完成。Sun/Oracle JDK与Open JDK中采用的虚拟机都是HotSpot VM(热点代码探测技术),它是目前为止市面上使用率最高的JVM。

HotSpot VM是在之前的JVM基础上又引入的新技术之一,它是JIT编译器统计热点方法技术的雏形,可以实现栈上分配(OSR,On Stack Replacement)直接编译生成机器码,并进行智能化分析,从而在响应时间和性能之间达到最佳的平衡状态。

1.5.3 移动端标准:Sun Mobile Embedded VM

之前介绍的虚拟机主要面向服务器和桌面级,除此之外,Sun公司对移动端领域也进行了扩展。

移动端发展的虚拟机主要有以下5种。

(1)KVM:主要以简单化、轻量级和可移植性为重心,但执行效率较低,一般用于计算能力较低的场景。

(2)CDC/CLDC:主要是Java ME体系的核心虚拟机。

(3)Squawk VM:一款大多数功能由Java代码实现的嵌入式虚拟机。

(4)JavaInJava:一款试图希望用Java代码实现的元循环Java虚拟机。

(5)Maxine VM:一款与JavaIn Java相似的虚拟机,都是采用Java代码实现主体功能的,与JavaIn Java相比多了很多强大的功能,如GC回收器和JIT编译器等。

1.5.4 诸子百家:BEA JRockit

除了Sun公司外,其他公司和组织也开发了属于自己的JVM,其中BEA公司的JRockit就比较成功。因为JRockit主要关注运行速度,所以内部不存在解释器,只存在编译器,最大化地提升了代码执行的速度。此外,其对JVM中的垃圾回收机制和JMC(JVM的运行状态管理工具)的实现也非常优秀,一直处于JVM领域的前列。

1.5.5 百家争鸣:IBM J9

相比BEA的JRockit,IBM公司也开发了很多类型的JVM,其中最知名的就是J9,其侧重点和JRockit大相径庭,而与HotSpot VM的设计方向一样,主要面向服务端到桌面级领域,其目的主要是结合IBM自身的生态环境和运行平台使用。

1.5.6 旷古烁今:Azul VM

Azul VM是在HotSpot VM基础上进行二次开发并优化所产生的高性能JVM,其性能比上述介绍的其他虚拟机要更加强大。从内存控制和资源管理的角度而言,Azul VM非常优秀,笔者认为该虚拟机非常适合那些有着大数据量计算和处理的服务项目。

1.5.7 其他鲜为人知的VM

除了前面介绍的虚拟机之外,市面上还有很多不为人所知的虚拟机,它们虽然不是很出名,但同样也是技术探究的结晶,如JamVM、CacaoVM、SableVM、Jelatine JVM、Nano VM、Moxie JVM、Jikes RVM等。如果读者有兴趣,可以在网上搜索相关资料。

注意:对于本章内容中包含的一些底层组件或是较为复杂的概念,后续章节中会对其进行详细的介绍和说明,本阶段读者只需要了解即可。