Java虚拟机学习-认识JAVA及其虚拟机

一、Java技术体系

JCP(Java Community Process,就是人们常说的“Java社区 )官方定义的Java技术体系包括:

  1. Java程序设计语言
  2. 各种硬件平台上的Java虚拟机实现
  3. Class文件格式
  4. Java类库API
  5. 来自商业机构和开源社区的第三方Java类库

二、Java历史

1991-04:James Gosling博士领导的绿色计划(Green Project)开始启动 Java语言前身Oak(得名于James Gosling办公室外的一棵橡树)

1995-05-23:Oak语言改名为Java,Sun World大会上发布Java 1.0。 Write Once, Run Anywhere

1996-01-23:JDK1.0 发布 Java第一个正式版运行环境,提供了春节是执行的Java虚拟机(Sun Classic VM),主要技术包括Java虚拟机、Applet、AWT等

1996:Java技术发展,十大操作系统和计算机供应商声明在其产品中嵌入Java技术,大量网页应用了Java技术来制作

1996-05:Sun于美国旧金山举行了首届JavaOne大会

1997-02-19:JDK1.1发布,主要技术包含:JAR文件格式、JDBC、JavaBeans、RMI等,Java语法增强了内部类(Inner Class)和反射(ReflectIon)

1998-12-04:JDK1.2发布,Java技术体系拆分为三个方向:J2SE(Java 2 Platform, Standard Edition)面向桌面应用开发、J2EE(Java 2 Platform, Enterprise Edition)面向企业级开发、J2ME(Java 2 Platform, Micro Edition)面向移动端开发。主要技术包含:EJB、Java Olug-in、Java IDL、Swing等。首次内置了JIT(Just In Time)即时编译器,在随后的更新版本中多个虚拟机共存(Classic VM、HotSpot VM、Exact VM(只在Solaris平台出现)),Java加入了strictfp关键字,Collections集合类。

1999-04-27:HotSpot虚拟机诞生

2000-05-08:JDK1.3发布,主要技术包含:数学运算和新的Timer API等,JNDI服务作为平台及服务,使用CORBA IIOP来实现RMI通信协议,改进了JAVA 2D API,新添加了JavaSound类库。1.3版本开始大概每隔两年发布一个JDK主版本直到ORACLE收购Sun

2002-02-13:JDK1.4发布,主要技术包含:正则表达式、异常链、NIO、日之类、XML解析器、XSLT转换器。

2004-09-30:JDK 5发布,版本号正式改为 JDK x 方式命名,主要技术包含:自动装箱、泛型、动态注解、枚举、可变长参数、遍历循环(foreach循环),改进了Java内存模型、提供了java.util.concurrent并发包等。其为可支持Windows 9x操作系统的最后一个JDK版本。

2006-12-11:JDK 6发布,停止了J2EE、J2SE、J2ME产品线命名,启用了 Java EE、Java SE、Java ME。主要技术包含:初步提供动态语言支持(通过内置Mozilla JavaScript Rhino引擎实现)、提供编译器注解处理器和卫星HTTP服务器API。Java虚拟机做了大量改进:包括锁与同步、垃圾收集、类加载等方面。2006-11-13日的JavaOne大会上,Sun宣布计划要把Java开源,陆续将JDK各部分在GPL v2(GNU Genearl Public License v2)协议下公开了源代码,除少量的产权代码外,并建立OpenJDK组织对源代码进行独立管理。

2010-10-24:Oracle完成对Sun的收购(2009-04-20开始)合并

2011-07-28:JDK 7发布,主要技术包含:提供新的G1收集器、加强对非Java语言的调用支持、可并行的类加载架构等。从JDK 7 Update4起Java SE 核心功能支持Mac OS X操作系统。JDK 7 Update6还对ARM指令集架构提供了支持。JDK 7 也是支持Windows XP操作系统的最后一个版本

2014-03-18:JDK 8发布,Oracle启用JEPJDK Enhancement Proposals)来定义和管理纳入新版JDK发布范围的功能特性。主要技术包含:对Lambda表达式的支持,内置Nashron JavaScript引擎的支持、新的时间、日期API、彻底移除HotSpot的永久代,引入元空间概念

2017-09-22:JDK 9发布,主要技术包含:Jigsaw还增强了若干工具(JS ShellJLinkJHSDB等),整顿了HotSpot各个模块各自为战的日志系统,支持HTTP 2客户端API91JEP。JDK 9发布后,Oracle随即宣布Java将会以持续交付的形式和更加敏捷的研发节奏向前推进,以后 JDK将会在每年的3月和9月各发布一个大版本,每六个JDK大版本中才会被划出一个长期支持(Long Term SupportLTS)版,只有LTS版的JDK能够获得为期三年的支持和更新,普通版的JDK就只有短短六个月的生命周期。JDK 8JDK 11会是LTS版,再下一个就到2021年发布的JDK 17了。

2018-03-20:JDK 10发布,主要技术包含:内部重构,诸如统一源仓库、统一垃圾收集器接口、统一即时编译器接口(JVMCIJDK 9已经有了,这里是引入新的Graal即时编译器)、类型推断等。20183月,Oracle正式宣告Java EE成为历史名词。所有权直接赠送给Eclipse基金会,唯一的条件是以后不准再使用“Java”这个商标,所以取而代之的将是Jakarta EE。Java Mission Control的开发团队,也在20186月被Oracle解散。201810月,JavaOne 2018在旧金山举行,这是最后一届JavaOne大会。

 

2018-09-25:JDK 11发布,主要技术包含:ZGC垃圾收集器、类型推断加入Lambda语法。同时调整了JDK授权许可证,并同时发布 OpenJDK 和 OracleJDK

2019-03-19:JDK 12发布,主要技术包含:Switch表达式(预览版)、Java微测试套件(JMH)等新功能

2019-09-17:JDK 13发布,主要技术包含:支持Unicode 12.1、动态CDS归档(Dynamic CDS Archiving)、java.net.Socket和java.net.ServerSocket API的重新实现、ZGC的增强、文本块(预览语言功能)、switch表达式(预览语言功能)

2020-03-17:JDK 14发布,主要技术包含:instanceof的模式匹配、Java打包工具(孵化项目)、G1支持NUMA、JRF事件流、指向NVM的MappedByteBuffer、更有价值的NullPointerException、记录类型(预览)、Switch表达式、废弃Solaris和SPARC移植、删除CMS垃圾回收器、ZGC的macOS支持、ZGC的Windows支持、废弃ParallelScavenge + SerialOld的GC组合、删除Pack200工具和API、文本块(预览)、外部内存地址访API、

2020-09-15:JDK 15发布,主要技术包含:加密签名、文本块、隐藏类、外部存储器访问API、ZGC、模式匹配和Records等。

三、Java虚拟机

1、Sun Classic/Exact VM

Sun Classic虚拟机的技术已经相当原始,这款虚拟机的使命也早已终结。但它是“世界上第一款商用Java虚拟机”,这款虚拟机只能使用纯解释器方式来执行Java代码,如果要使用即时编译器那就必须进行外挂

“sunwjit”Sun Workshop JIT)就是Sun提供的外挂编译器,其他类似的外挂编译器还有Symantec JIT和shuJIT等。

JDK 1.2时,曾在Solaris平台上发布过一款名为Exact VM的虚拟机,它的编译执行系统已经具备现代高性能虚拟机雏形,如热点探测、两级即时编译器、编译器与解释器混合工作模式等。Exact VM因它使用准确式内存管理(Exact Memory Management,也可以叫Non-Con-servative/Accurate Memory Management)而得名。准确式内存管理是指虚拟机可以知道内存中某个位置的数据具体是什么类型。而在JDK 1.3时,HotSpot VM成为默认虚拟机,它仍作为虚拟机的备用选择”发布(使用java-classic参数切换),直到JDK 1.4的时候,Classic VM才完全退出商用虚拟机的历史舞台,与Exact VM一起进入了Sun Labs Research VM之中。

2、HotSpot VM

HotSpot虚拟机,是Sun/OracleJDKOpenJDK中的默认Java虚拟机,也是目前使用范围最广的Java虚拟机。在最初并非由Sun公司所开发,而是由一家名为“Longview Technologies”的小公司设计;这个虚拟机最初并非是为Java语言而研发的,它来源于Strongtalk虚拟机,而这款虚拟机中相当多的技术又是来源于一款为支持Self语言实现达到C语言50%以上的执行效率的目标而设计的Self虚拟机,最终甚至可以追溯到20世纪80年代中期开发的Berkeley Smalltalk上。Sun公司注意到这款虚拟机在即时编译等多个方面有着优秀的理念和实际成果,在1997年收购了Longview Technologies公司,从而获得了HotSpot虚拟机。

HotSpot既继承了Sun之前两款商用虚拟机的优点(如前面提到的准确式内存管理),也有许多自己新的技术优势,如它名称中的HotSpot指的就是它的热点代码探测技术HotSpot虚拟机的热点代码探测能力可以通过执行计数器找出最具有编译价值的代码,然后通知即时编译器以方法为单位进行编译。如果一个方法被频繁调用,或方法中有效循环次数很多,将会分别触发标准即时编译和栈上替换编译(On-Stack Replacement,OSR)行为。通过编译器与解释器恰当地协同工作,可以在最优化的程序响应时间与最佳执行性能中取得平衡,而且无须等待本地代码输出才能执行程序,即时编译的时间压力也相对减小,这样有助于引入更复杂的代码优化技术,输出质量更高的本地代码。

Oracle收购Sun以后,建立了HotRockit项目来把原来BEA JRockit中的优秀特性融合到HotSpot之中。到了2014年的JDK 8时期,里面的HotSpot就已是两者融合的结果,HotSpot在这个过程里移除掉永久代,吸收了JRockitJava Mission Control监控工具等功能。得益于Sun/OracleJDKJava应用中的统治地位,HotSpot理所当然地成为全世界使用最广泛的Java虚拟机。

3、Mobile/Embedded VM

Oracle公司在Java ME这条产品线上的虚拟机名为CDC-HIC Virtual Machine,CVM)和CLDC-HIMonty VM)。其中CDC/CLDC全称是ConnectedLimitedDevice Configuration,这是一组在JSR-139JSR-218规范中进行定义的Java API子集,这组规范希望能够在手机、电子书、PDA等移动设备上建立统一的Java编程接口

在嵌入式设备上,Java ME Embedded又面临着自家Java SE EmbeddedeJDK)的直接竞争和侵蚀,主打高端的CDC-HI经过多年来的扩充,在核心部分其实已经跟Java SE非常接近,能用Java SE的地方大家自然就不愿意用Java ME,所以市场在快速萎缩,Oracle也基本上砍掉了CDC-HI的所有项目,把它们都划归到了Java SE Embedded下。Java SE Embedded里带的Java虚拟机当然还是HotSpot,但这是为了适应嵌入式环境专门定制裁剪的版本,尽可能在支持完整的Java SE功能的前提下向着减少内存消耗的方向优化,譬如只留下了客户端编译器(C1),去掉了服务端编译器(C2);只保留Serial/Serial Old垃圾收集器,去掉了其他收集器等。

面向更低端设备的CLDC-HI倒是在智能控制器、传感器等领域还算能维持自己的一片市场,现在也还在继续发展,但前途并不乐观。目前CLDC中活得最好的产品反而是原本早该被CLDC-HI淘汰的KVM,国内的老人手机和出口到经济欠发达国家的功能手机(Feature Phone)还在广泛使用这种更加简单、资源消耗也更小的上一代Java ME虚拟机。

4、BEA JRockit/IBM J9 VM

JRockit虚拟机曾经号称是世界上速度最快的Java虚拟机,它是BEA2002年从Appeal Virtual Machines公司收购获得的Java虚拟机。BEA将其发展为一款专门为服务器硬件和服务端应用场景高度优化的虚拟机,由于专注于服务端应用,它可以不太关注于程序启动速度,因此JRockit内部不包含解释器实现,全部代码都靠即时编译器编译后执行。除此之外,JRockit的垃圾收集器和Java Mission Control故障处理套件等部分的实现,在当时众多的Java虚拟机中也处于领先水平。JRockit随着BEAOracle收购,现已不再继续发展,永远停留在R28版本,这是JDK 6JRockit的代号。

IBM J9虚拟机并不是IBM公司唯一的Java虚拟机,不过目前IBM主力发展无疑就是J9J9这个名字最初只是内部开发代号而已,开始选定的正式名称是“IBM Technology for Java Virtual Machine”,简称IT4J,但这个名字太拗口,接受程度远不如J9J9虚拟机最初是由IBM Ottawa实验室的一个SmallTalk虚拟机项目扩展而来,当时这个虚拟机有一个Bug是因为8KB常量值定义错误引起,工程师们花了很长时间终于发现并解决了这个错误,此后这个版本的虚拟机就被称为K8,后来由其扩展而来、支持Java语言的虚拟机就被命名为J9。与BEA JRockit只专注于服务端应用不同,IBM J9虚拟机的市场定位与HotSpot比较接近,它是一款在设计上全面考虑服务端、桌面应用,再到嵌入式的多用途虚拟机,开发J9的目的是作为IBM公司各种Java产品的执行平台,在和IBM产品(如IBM WebSphere等)搭配以及在IBM AIXz/OS这些平台上部署Java应用。

IBM J9直至今天仍旧非常活跃,IBM J9虚拟机的职责分离与模块化做得比HotSpot更优秀,由J9虚拟机中抽象封装出来的核心组件库(包括垃圾收集器、即时编译器、诊断监控子系统等)就单独构成了IBM OMR项目,可以在其他语言平台如RubyPython中快速组装成相应的功能。从2016年起,IBM逐步将OMR项目和J9虚拟机进行开源,完全开源后便将它们捐献给了Eclipse基金会管理,并重新命名为Eclipse OMROpenJ9。如果为了学习虚拟机技术而去阅读源码,更加模块化的OpenJ9代码其实是比HotSpot更好的选择。如果为了使用Java虚拟机时多一种选择,那可以通过AdoptOpenJDK来获得采用OpenJ9搭配上OpenJDK其他类库组成的完整JDK

BEAIBM公司外,其他一些大公司也号称有自己的专属JDK和虚拟机,但是它们要么是通过从Sun/Oracle公司购买版权的方式获得的(如HPSAP等),要么是基于OpenJDK项目改进而来的(如阿里巴巴、Twitter等),都并非自己独立开发。

5、BEA Liquid VM/Azul VM

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

Azul VMAzul Systems公司在HotSpot基础上进行大量改进,运行于Azul Systems公司的专有硬件Vega系统上的Java虚拟机,每个Azul VM实例都可以管理至少数十个CPU和数百GB的内存的硬件资源,并提供在巨大内存范围内停顿时间可控的垃圾收集器(即业内赫赫有名的PGCC4收集器),为专有硬件优化的线程调度等优秀特性。2010年起,Azul公司的重心逐渐开始从硬件转向软件,发布了自己的Zing虚拟机,可以在通用x86平台上提供接近于Vega系统的性能和一致的功能特性。

6、Apache Harmony/Google Android Dalvik VM

Apache Harmony是一个Apache软件基金会旗下以Apache License协议开源的实际兼容于JDK 5和JDK 6的Java程序运行平台,它含有自己的虚拟机和Java类库API,用户可以在上面运行Eclipse、Tomcat、Maven等常用的Java程序。但是,它并没有通过TCK认证,所以我们不得不用一长串冗长拗口的语言来介绍它,而不能用一句“ApacheJDK”或者“ApacheJava虚拟机来直接代指。

Dalvik虚拟机曾经是Android平台的核心组成部分之一,它的名字来源于冰岛一个名为Dalvik的小渔村。Dalvik虚拟机并不是一个Java虚拟机,它没有遵循《Java虚拟机规范》,不能直接执行Java的 Class文件,使用寄存器架构而不是Java虚拟机中常见的栈架构。

7、Microsoft JVM及其他

  • 微软为IE3 浏览器支持Java Applets开发的虚拟机,只能运行在Windows系统,因和Sun的纠纷而在Windows XP SP3中彻底移除
  • KVM中的K“Kilobyte”的意思,它强调简单、轻量、高度可移植,但是运行速度比较慢。在Android、iOS等智能手机操作系统出现前曾经在手机平台上得到非常广泛应用。
  • Java Card VM:JCVM是 Java 虚拟机很小的一个子集,裁减了许多模块但通常支持绝大多数的常用加密算法。 JCVM必须精简到能放入智能卡、 SIM 卡、银行信用卡、借记卡内,负责对 Java Applet 程序进行解释执行。
  •  
    Squawk VM是由Sun开发,运行于Sun SPOT(Sun Small Programmable Object Tech-nology,一种手持的Wi-Fi设备),也曾经运用于Java Card。这是一个Java代码比重很高的嵌入式虚拟机实现,其中诸 如类加载器、字节码验证器、垃圾收集器、解释器、编译器和线程调度都是用Java语言完成的,仅仅靠C语言来编写设备I/O和必要的本地代码。
     
  • JavaInJava Sun 公司在 1997 年~ 1998 年间所研发的一个实验室性质的虚拟机,从名字就可以看出,它试图以Java 语言来实现 Java 语言本身的运行环境,既所谓的 元循环 Meta-Circular ,是指使用语言自身来实现其运行环境)虚拟机。它必须运行在另外一个宿主虚拟机之上,内部没有即时编译器,代码只能以解释模式执行。在上世纪末主流原生的Java 虚拟机都未能很好解决性能问题的时代,开发这种项目,其执行速度大家可想而知,不过通过元循环证明一门语言可以自举,是具有它的研究价值的。
  •  
    Maxine VM 和上面的 JavaInJava 非常相似,它也是一个几乎全部以 Java 代码实现(只有用于启动Java虚拟机的加载器使用 C 语言编写)的元循环 Java 虚拟机。这个项目于 2005 年开始,到现在仍然在发展之中,比起JavaInJava Maxine VM 的执行效率就显得靠谱得多,它有先进的即时编译器和垃圾收集器,可在宿主模式或独立模式下执行,其执行效率已经接近HotSpot 虚拟机 Client 模式的水平。后来有了从C1X 编译器演进而来的 Graal 编译器的支持,就更加如虎添翼,执行效率有了进一步飞跃。 Graal 编译器现在已经是HotSpot 的默认组件,是未来代替 HotSpot 中服务端编译器的希望。

 

  • Jikes RVM是IBM开发的专门用来研究Java虚拟机实现技术的项目。曾用名为Jalapeño。与JavaInJava和Maxine一样,它也是一个元循环虚拟机
  • IKVM.NET:这是一个基于微软.NET框架实现的Java虚拟机,并借助Mono获得一定的跨平台能力。IKVM.NET的目标第一眼看起来的确很奇怪,可能在某些特殊情况下,在.NET上使用某些流行的Java库也许真的不算是伪需求?IKVM.NET可以将Class文件编译成.NET Assembly,在任意的CLI上运行。
  • JamVM:http://jamvm.sourceforge.net/
  • CacaoVM:http://www.cacaovm.org/
  • SableVM:http://www.sablevm.org/
  • Kaffe:http://www.kaffe.org/
  • Jelatine JVM:http://jelatine.sourceforge.net/
  • NanoVM:http://www.harbaum.org/till/nanovm/index.shtml
  • MRP:https://github.com/codehaus/mrp
  • Moxie JVM:http://moxie.sourceforge.net/

你可能感兴趣的:(计算机,JAVA,JAVA基础,java,jdk,jvm)