1-Java虚拟机的发展史(笔记)
1. 前言
当提升硬件性能对Java程序运行状况没有任何改善时.这里有Java虚拟机的原因:为给硬件提供一直的虚拟平台而牺牲了与硬件有关的性能特性.开发人员不了解虚拟机一些技术特性的原理,导致无法写出最适合虚拟机运行和自优化的代码.而目前商用的高性能Java虚拟机都提供了相当多的优化特性和调节手段,这在企业级生产开发中是迫切需求的.
2. Java技术体系所包含的内容.
Java技术体系可以根据各组成部分的功能来划分,也可以根据Java技术关注的重点业务领域来划分.
2.1 按各部分功能划分.
2.2 按业务领域来划分.
- Java Card:支持一些小程序(Applets)运行在小内存设备(如智能卡)上.
- Java ME(Micro Edition):支持Java程序运行在移动终端(手机,PDA)上的平台.
- Java SE:面向桌面级应用(比如说Windows下的应用程序)的Java平台,提供完整地Java核心API.之前称J2SE.
- Java EE:支持多层架构的企业应用的Java平台.除了提供Java SE API之外,还做了大量的补充(这些拓展一般以javax.*作为包名)并提供了相关的部署支持.之前称作J2EE.
3. Java虚拟机的发展史.
自96年SUN公司发布包含JVM的JDK依赖,产生了大量优秀的JVM.下面将简单的进行介绍.
3.1 Sun Classic/Exact VM
Sun Classic 是世界上第一款商用的JVM,这款JVM只能以纯解释器的方式来执行Java代码,如果要使用JIT编译器,就必须进行外挂.而一旦外挂了JIT编译器,JIT编译器将完全接管虚拟机的执行系统,解释器又不在工作了.由于解释器和编译器不能配合工作,如果使用编译器执行,编译器将针对每一条代码进行编译,基于响应时间的压力,又无法使用编译耗时稍高的优化技术."Java语言很慢"的形象就是在这时候在用户心目中形成的.
3.2 Exact VM
为解决Classic VM所面临的问题,Sun的虚拟机团队在Solaris平台上发布了一款名为Exact VM的虚拟机.
这款虚拟机已具备现代高性能虚拟机的雏形,比如两级即时编译器、编译器和处理器的混合处理模式等.它因使用准确式内存管理而得名,即虚拟机可以知道内存中某个位置存储的数据具体是什么类型,这将有利于在GC(垃圾收集)的时候准确判断堆上的数据是否还有可能被使用,而每一次定位对象的时候都少了一次间接查找的开销,从而提高了执行效率.
虽然Exact VM相对Classic VM来说先进了很多,但它还没有来的发布Windows和Linux平台下的商用版本就被更加优秀的Hotspot VM所取代了.而Classic VM的生命周期则相对长了很多,其在JDK 1.2和JDK 1.3中也作为备用选择与Hotspot VM并存.直到JDK 1.4时Classic VM真正的完全退出了商用JVM的历史舞台.
3.3 Sun Hotspot VM.
Hotspot VM是Sun JDK和OpenJDK中所带的JVM,但并非是由Sun公司开发的,而是由一家名叫"Longview Technologies"的小公司设计,Sun公司注意到这款虚拟机在JIT编译上的诸多优秀理念和实际效果,在1997年收购了Longview Technologies公司,从而获得了Hotspot VM.
Hotspot VM即继承了Sun之前两款商用虚拟机的优点,(如前面所说的准确内存管理),也具备其自身的技术优势.正如其名称:Hotspot指的是它的热点代码探测技术.它可以通过执行计数器来找出最具备编译价值的代码,然后通知JIT编译器以方法为单位进行编译,通过编译器和解释器恰当的协同工作,可以在最优化的程序执行时间和最佳执行性能之间取得平衡.
在2006年的JavaOne大会上,Sun公司宣布最终将会把Java开源,并在随后的一年中陆续将JDK的各个部分(包括Hotspot VM)在GPL协议下公开了源码.并在此基础之上建立了OpenJDK.
2008年和2009年,Oracle公司分别收购了BEA公司和Sun公司,如此便获得了两款优秀的Java虚拟机:JRockit VM和Hotspot JM.随后完整了这两款虚拟机的整合工作,使之优势互补.
3.4 Sun Mobile-Embedded VM/Meta-Circular VM.
Sun公司所研发的虚拟机不仅有前面所述的服务器、桌面领域的商用虚拟机.Sun公司还面对移动和嵌入式市场研发过相应的虚拟机.另有一些虚拟机,设计之初并没有报商用的目的,而仅仅用作研究之用、验证技术的可行性.
3.4.1 KVM.
KVM直译过来是千比特,它具备简单、高效、高度可移植性的特点,但其运行速度比较慢.在Android和IOS等智能手机还未出现之前层在手机平台上得到非常广泛的应用.
3.4.2 CDC/CLDC Hotspot Implementation.
它曾希望在手机、电子书、PDA等设备上建立统一的Java编程接口,但就目前Android和IOS二分天下的移动数字设备市场来看,Sun的虚拟机所面临的局面明显不如服务器和桌面领域乐观.
3.4.3 Squawk VM.
曾用于Java Card.这是一种Java代码比重比较很高的嵌入式虚拟机实现.
3.4.4. JavaInJava
一个实验室性质的虚拟机.它试图使用Java语言来实现Java语言本身的运行环境,即所谓的"元循环".必须运行在另一台宿主虚拟机之上,内部没有JIT编译器,代码只能解释执行,其执行速度可想而知.
3.4.5 Maxine VM
与JavaInJava非常相似,它是几乎全部以Java代码实现的元循环Java虚拟机.由于有先进的JIT编译器和垃圾收集器,且可在宿主模式或独立模式下执行,其执行效率已接近于Hotspot Client VM的水平了.
3.5 BEA JRockit/IBM J9 VM
除了Sun公司以外,还有其他公司或组织研发过虚拟机实现.其中规模最大,最著名的是BEA和IBM公司.
JRockit VM是BEA公司专为服务器硬件和服务器端应用场景高度优化的虚拟机.专注于服务器端应用,因此它不太注重程序的启动速度.其全部代码都靠即时编译器编译后执行.除此之外,JRockit VM的垃圾收集器和MissionControl服务套件等部分的实现在众多JVM中一直处于领先水平.
与JRockit VM不同,IBM J9的市场定位与Sun Hotspot比较接近.它是一款从服务器端到桌面领域再到嵌入式都全面考虑的多用途虚拟机.J9的开发目的是为IBM公司各种Java产品的执行平台.
3.5 Azul VM/BEA Liquid VM
相对之前所说的在通用平台上运行的商用虚拟机,在特定硬件平台上运行的专用虚拟机才是"高性能神器"!
Azul VM是经Azul Systems 公司改造Hotspot VM的,运行在自家专有硬件Vega系统上的JVM.
Liquid VM即是BEA公司研发,运行在自家Hepervisor系统上的JRockit VM的虚拟化版本,它不需要操作系统的支持.越过操作系统直接控制硬件有诸多好处,可以最大限度的发挥硬件的能力,提升Java应用程序的执行性能.
3.6 Apache Harmony /Google Android Dalvik VM
Apache Harmony是Apache软件基金会旗下的Java程序运行平台.但却没有获得TCK使用授权.自从Sun将JDK开源形成Open JDK以来,Apache Harmony 开源的优势被极大地削弱.虽然Harmony没有经过真正大规模的商业运用,但它的代码被先进入了IBM的JDK 7的实现及Google Android SDK之中,对Android的发展有很大的推动作用.
Android让Java语言真正走向了移动数码设备领域,Dalvik VM是Android平台的核心组成部分之一.它不是JVM,但却和JVM有着千丝万缕的联系.跟随着Android一起处于迅猛发展阶段,Android2.2中即时编译器的实现,使其在执行性能上有很大的提高.
3.7 Microsoft JVM及其他.
Java语言诞生初期,它的主要应用之一是在浏览器中运行Java Applets程序,微软公司为了在IE3中支持Java Applets应用而开发了自己的JVM,虽然只有Windows平台下的版本.却是当时Windows下性能最好的JVM.