java虚拟机--走近java


一、相关概念

1. JDK

Java程序设计语言、Java虚拟机、Java API类库这三部分统称为JDK(JavaDevelopment Kit),JDK是用于支持Java程序开发的最小环境。

2. JRE

把Java API类库中的Java SEAPI子集和Java虚拟机这两部分统称为JRE(Java Runtime Environment),JRE是支持Java程序运行的标准环境。

3. 技术体系

分为4个平台:


  1. Java Card:支持一些Java小程序(Applets)运行在小内存设备(如智能卡)上的平台。
  2. Java ME(Micro Edition):支持Java程序运行在移动终端(手机、PDA)上的平台,对Java API有所精简,并加入了针对移动终端的支持,这个版本以前称为J2ME。
  3. Java SE(Standard Edition):支持面向桌面级应用(如Windows下的应用程序)的Java平台,提供了完整的Java核心API,这个版本以前称为J2SE。
  4. J2EE,提供了相关的部署支持。

二、java发展史


  1. 1991年4月 – Java语言的前身:Oak(橡树)。
  2. 1995年5月23日,Oak改名java,发布java1.0版本–“Write Once,Run Anywhere”。
  3. 1996年1月23日,JDK 1.0发布,Java语言有了第一个正式版本的运行环境。–Java虚拟机、Applet、AWT等。
  4. 1997年2月19日,Sun公司发布了JDK 1.1。–JAR文件格式、JDBC、JavaBeans、RMI。
  5. 1999年4月8日,JDK 1.1一共发布了1.1.0~1.1.8九个版本。
  6. 1998年12月4日,JDK迎来了一个里程碑式的版本JDK 1.2,工程代号为Playground (竞技场)。Sun在这个版本中把Java技术体系拆分为3个方向,分别是


面向桌面应用开发的J2SE(Java 2 Platform,Standard Edition) 面向企业级开发的J2EE(Java 2
Platform,Enterprise Edition) 面向手机等移动终端开发的J2ME(Java 2
Platform,MicroEdition)



  1. 1999年4月27日,HotSpot虚拟机发布。2000年5月8日,工程代号为Kestrel(美洲红隼)的JDK 1.3发布。
  2. 2002年2月13日,JDK 1.4发布,工程代号为Merlin(灰背隼)–Java真正走向成熟的一个版本。
  3. 2004年9月30日,JDK 1.5发布,工程代号Tiger(老虎),是官方声明可以支持Windows9x平台的最后一个JDK版本。
  4. 2006年12月11日,JDK 1.6发布,工程代号Mustang(野马),启用Java SE 6、Java EE 6、Java ME 6的命名方式 。
  5. 2009年2月19日,工程代号为Dolphin(海豚)的JDK 1.7完成了其第一个里程碑版本。
  6. 2009年4月20日,Oracle公司宣布正式以74亿美元的价格收购Sun公司,Java商标从此正式归Oracle所有(Java语言本身并不属于哪间公司所有,它由JCP组织进行管理,尽管JCP主要是由Sun公司或者说Oracle公司所领导的)。

三、java虚拟机的发展史

1. Sun Classic/Exact VM

世界上第一款商用Java虚拟机

1996年1月23日,Sun公司发布JDK 1.0,Java语言首次拥有了商用的正式运行环境,这个JDK中所带的虚拟机就是Classic VM。

2. Sun HotSpot VM

使用范围最广的Java虚拟机

HotSpot VM既继承了Sun之前两款商用虚拟机的优点,也有许多自己新的技术优势。在2006年的JavaOne大会上,Sun公司宣布最终会把Java开源,并在随后的一年,陆续将JDK的各个部分(其中当然也包括了HotSpot VM)在GPL协议下公开了源码,并在此基础上建立了OpenJDK。这样,HotSpot VM便成为了Sun JDK和OpenJDK两个实现极度接近的JDK项目的共同虚拟机。

3. Sun Mobile-Embedded VM/Meta-Circular VM

Sun公司发布的其他Java虚拟机有:


  1. KVM
    KVM中的K是“Kilobyte”的意思,它强调简单、轻量、高度可移植,但是运行速度比较慢。在Android、iOS等智能手机操作系统出现前曾经在手机平台上得到非常广泛的应用。
  2. CDC/CLDC HotSpot Implementation
    CDC/CLDC全称是Connected(Limited)Device Configuration,在JSR-139/JSR-218规范中进行定义,它希望在手机、电子书、PDA等设备上建立统一的Java编程接口,而CDC-HI VM和CLDC-HI VM则是它们的一组参考实现。
  3. Squawk VM
    Squawk VM由Sun公司开发,运行于Sun SPOT(Sun Small Programmable ObjectTechnology,一种手持的WiFi设备),也曾经运用于Java Card。这是一个Java代码比重很高的嵌入式虚拟机实现,其中诸如类加载器、字节码验证器、垃圾收集器、解释器、编译器和线程调度都是Java语言本身完成的,仅仅靠C语言来编写设备I/O和必要的本地代码。
  4. JavaInJava
    Sun公司于1997年~1998年间研发的一个实验室性质的虚拟机,试图以Java语言来实现Java语言本身的运行环境,既所谓的“元循环”(Meta-Circular,是指使用语言自身来实现其运行环境)。它必须运行在另外一个宿主虚拟机之上,内部没有JIT编译器,代码只能以解释模式执行。
  5. Maxine VM
    一个几乎全部以Java代码实现(只有用于启动JVM的加载器使用C语言编写)的元循环Java虚拟机。这个项目于2005年开始,到现在仍然在发展之中,比起JavaInJava,Maxine VM就显得“靠谱”很多,它有先进的JIT编译器和垃圾收集器(但没有解释器),可在宿主模式或独立模式下执行,其执行效率已经接近了HotSpotClient VM的水平。

4. BEA JRockit/IBM J9 VM

BEA公司在2002年从Appeal Virtual Machines公司收购的虚拟机。JRockit的垃圾收集器和MissionControl服务套件等部分的实现,在众多Java虚拟机中也一直处于领先水平。

IBM J9的市场定位与Sun HotSpot比较接近,它是一款设计上从服务器端到桌面应用再到嵌入式都全面考虑的多用途虚拟机,J9的开发目的是作为IBM公司各种Java产品的执行平台,它的主要市场是和IBM产品(如IBM WebSphere等)搭配以及在IBM AIX和z/OS这些平台上部署Java应用。

5. Azul VM/BEA Liquid VM

Azul VM是Azul Systems公司在HotSpot基础上进行大量改进,运行于Azul Systems公司的专有硬件Vega系统上的Java虚拟机,每个Azul VM实例都可以管理至少数十个CPU和数百GB内存的硬件资源,并提供在巨大内存范围内实现可控的GC时间的垃圾收集器、为专有硬件优化的线程调度等优秀特性。在2010年,Azul Systems公司开始从硬件转向软件,发布了自己的ZingJVM,可以在通用x86平台上提供接近于Vega系统的特性。

Liquid VM即是现在的JRockit VE(Virtual Edition),它是BEA公司开发的,可以直接运行在自家Hypervisor系统上的JRockit VM的虚拟化版本,Liquid VM不需要操作系统的支持,或者说它自己本身实现了一个专用操作系统的必要功能,如文件系统、网络支持等。由虚拟机越过通用操作系统直接控制硬件可以获得很多好处,如在线程调度时,不需要再进行内核态/用户态的切换等,这样可以最大限度地发挥硬件的能力,提升Java程序的执行性能。

6. Apache Harmony/Google Android Dalvik VM

Apache Harmony是一个Apache软件基金会旗下以Apache License协议开源的实际兼容于JDK1.5和JDK 1.6的Java程序运行平台。

在Sun将JDK开源形成OpenJDK之后,Apache Harmony开源的优势被极大地削弱,甚至连Harmony项目的最大参与者IBM公司也宣布辞去Harmony项目管理主席的职位,并参与OpenJDK项目的开发。虽然Harmony没有经过真正大规模的商业运用,但是它的许多代码(基本上是Java库部分的代码)被吸纳进IBM的JDK 7实现及Google Android SDK之中,尤其是对Android的发展起到了很大的推动作用。

Dalvik VM是Android平台的核心组成部分之一,它的名字来源于冰岛一个名为Dalvik的小渔村。Dalvik VM并不是一个Java虚拟机,它没有遵循Java虚拟机规范,不能直接执行Java的Class文件,使用的是寄存器架构而不是JVM中常见的栈架构。但是它与Java又有着千丝万缕的联系,它执行的dex(Dalvik Executable)文件可以通过Class文件转化而来,使用Java语法编写应用程序,可以直接使用大部分的Java API等。

7. Microsoft JVM及其他

微软公司的JVM等。

四、java技术未来

1. 模块化

模块化是解决应用系统与技术平台越来越复杂、越来越庞大问题的一个重要途径。

2. 混合语言

当单一的Java开发已经无法满足当前软件的复杂需求时,越来越多基于Java虚拟机的语言开发被应用到软件项目中,Java平台上的多语言混合编程正成为主流,每种语言都可以针对自己擅长的方面更好地解决问题。

3. 多核并行

CPU硬件的发展方向已经从高频率转变为多核心,随着多核时代的来临,软件开发越来越关注并行编程的领域。早在JDK 1.5就已经引入java.util.concurrent包实现了一个粗粒度的并发框架。

4. 进一步丰富语法

在Java7(由于进度压力,许多改进已推迟至Java 8)中,对Java语法进行了另一次大规模的扩充。Sun(已被Oracle收购)专门为改进Java语法在OpenJDK中建立了Coin子项目来统一处理对Java语法的细节修改,如二进制数的原生支持、在switch语句中支持字符串、“< >”操作符、异常处理的改进、简化变长参数方法调用、面向资源的try-catch-finally语句等都是在Coin项目之中提交的内容。除了Coin项目之外,在JSR-335(Lambda Expressions for the Java TM ProgrammingLanguage)中定义的Lambda表达式也将对Java的语法和语言习惯产生很大的影响,面向函数方式的编程可能会成为主流。

5. 64位虚拟机

在几年之前,主流的CPU就开始支持64位架构了。Java虚拟机也在很早之前就推出了支持64位系统的版本。但Java程序运行在64位虚拟机上需要付出比较大的额外代价:首先是内存问题,由于指针膨胀和各种数据类型对齐补白的原因,运行于64位系统上的Java应用需要消耗更多的内存,通常要比32位系统额外增加10%~30%的内存消耗;其次,多个机构的测试结果显示,64位虚拟机的运行速度在各个测试项中几乎全面落后于32位虚拟机,两者大约有15%左右的性能差距。

计算机终究会完全过渡到64位的时代,这是一件毫无疑问的事情,主流的虚拟机应用也终究会从32位发展至64位,而虚拟机对64位的支持也将会进一步完善。