JVM--走进Java

1.1 概述

  1) Java 能获得如此广泛的认可,除了他拥有一门结构严谨,面向对象的编程语言之外,还有许多不可忽视的有点:Java 摆脱了硬件平台的束缚,实现了“一次编写,到处运行”的理想;他提供了一个相对安全的内存管理和访问机制,避免了绝大部分的内存泄漏和指针越界问题;他实现了热点代码检测和运行时编译及优化,这使得 Java 应用能随着运行时间的增加而获得更高的性能;他有一套完整的应用程序接口,还有无数来自商业结构和开源社区的第三方类库来帮助他实现各种各样的功能。

1.2 Java技术体系

  1) 从广义上讲,Clojure、Jruby、Groovy 等运行于 Java 虚拟机上的语言及其相关的程序都属于 Java 技术体系中的一员。

      如果从传统意义上来看,Sun 官方所定义的 Java 技术体系包括以下几个部分:

      Java 程序设计语言

      各种硬件平台上的 Java 虚拟机

      Class 文件格式

      Java API 类库

      来自商业机构和开源社区的第三方 Java 类库

  2) 我们可以把 Java 程序设计语言、Java 虚拟机、Java API 类库这三部分统称为 JDK(Java Development Kit),JDK是用于支持 Java 程序开发的最小环境。另外,可以把 Java API类库中的 Java SE API 子集和 Java 虚拟机这两部分统称为 JRE(Java Runtime Environment)。JRE 是支持 Java 程序运行的标准环境。

  3) 根据各个组成部分的功能来进行划分,Java 技术体系所包含的内容

  4) 根据技术所服务的领域来划分,或者说按照 Java 技术关注的重点业务领域来划分,Java 技术体系可以分为4个平台,分别为:

      Java Card: 支持一些 Java 小程序(Applets)运行在小内存设备(如智能卡)上的平台

      Java ME(Micro Edition): 支持 Java 程序运行在移动终端上的平台,对 Java API 有所精简,并加入了针对移动终端的支持,这个版本以前称为 J2ME

      Java SE(Standard Edition): 支持面向桌面级应用(如 Windows 下的应用程序)的 Java平台,提供了完整的 Java 核心 API,这个版本以前称为 J2SE

      Java EE(Enterprise Editon): 支持使用多层框架的企业应用(如 ERP、CRM应用) 的Java 平台,除了提供 Java SE API 外,还对其做了大量的扩充并提供了相关的部署支持,这个版本以前称为 J2EE

  

1.3 Java 发展史

  1) Java 技术发展史

版本描述
1991年1月 Sun公司成立了Green项目小组,专攻智能家电的嵌入式控制系统
1991年2月 放弃C++,开发新语言,命名为“Oak”
1991年6月 JamesGosling开发了Oak的解释器
1992年1月 Green完成了Green操作系统、Oak语言、类库等开发
1992年11月 Green计划转化成“FirstPerson”,一个Sun公司的全资母公司
1993年2月 获得时代华纳的电视机顶盒交互系统的订单,于是开发的重心从家庭消费电子产品转到了电视盒机顶盒的相关平台上。
1994年6月 FirstPerson公司倒闭,员工都合并到Sun公司。Liveoak计划启动了,目标是使用Oak语言设计出一个操作系统。
1994年7月 第一个Java语言的Web浏览器WebRunner(后来改名为HotJava),Oak更名为Java。
1994年10月 VanHoff编写的Java编译器用于Java语言
1995年3月 在SunWorld大会,Sun公司正式介绍了Java和HotJava。
1996年1月 JDK1.0发布
1997年2月 J2SE1.1发布
1998年12月 J2SE1.2发布
1999年6月 发布Java的三个版本:J2SE、J2EE、J2ME
2000年5月 J2SE1.3发布
2001年9月 J2EE1.3发布
2002年2月 J2SE1.4发布
2004年9月 J2SE1.5发布,将J2SE1.5改名JavaSE5.0
2005年6月 JavaSE6.0发布,J2EE更名为JavaEE,J2SE更名为JavaSE,J2ME更名为JavaME
2006年12月 JRE6.0发布
2006年12月 JavaSE6发布
2009年12月 JavaEE6发布
2009年4月 Oracle收购Sun
2011年7月 JavaSE7发布
2014年3月 JavaSE8发布

  2) 1996年1月23日,JDK 1.0 发布,Java 语言有了第一个正式版本的运行环境。JDK 1.0 提供了一个纯解释执行的 Java 虚拟机实现(Sun Classic VM)。JDK 1.0 版本的代表技术包括:Java 虚拟机、Applet、AWT等。

  3) 1997年2月19日,Sun 公司发布了 JDK 1.1,Java 技术的一些最基础的支撑点(如 JDBC 等)都是在 JDK 1.1版本中发布的, JDK 1.1版的技术代表有:JAR 文件格式、JDBC、JavaBeans、RMI。Java 语法也有了一定的发展,如内部类和反射都是在这个时候出现的。

  4) 1998年4月8日,JDK 迎来了一个里程碑式的版本 JDK 1.2,工程代号为 Playground(竞技场),Sun 在这个版本中把 Java 技术体系拆分为3个方向,分别是面向桌面应用开发的 J2SE(Java 2 Platform, Standard Edition),面向企业级开发的 J2EE(Java 2 Platform, Enterprise Edition)和面向手机等移动终端开发的 J2ME(Java 2 Platform, Micro Edition)。在这个版本中出现的代表性技术非常多,如 EJB、Java Plug-in、Java IDL、Swing 等,并且这个版本中 Java虚拟机第一次内置了 JIT(Just In Time)编译器(Java 1.2中曾并存过3个虚拟机,Classic VM、HotSpot VM 和 Exact VM,其中 Exact VM只在 Solaris 平台出现过;后面两个虚拟机都是内置 JIT 编译器的,而之前版本所带的 Classic VM 只能以外挂的形式使用 JIT 编译器)。在语言和 API 级别上, Java 添加了 strictfp 关键字与现在 Java 编码之中极为常用分一系列 Collection 集合类。

  5) 1999年4月27日,HotSpot 虚拟机发布,HotSpot 最初由一家名为 “Longview Technologies” 的小公司开发,因为 HotSpot 的优异表现,这家公司在 1997 年被 Sun 公司受够了。HotSpot 虚拟机发布时时作为 JDK 1.2 的附加程序提供的,后来他成为了 JDK 1.3 及之后所有版本的 Sun JDK 的默认虚拟机。

  6) 2000年5月8日,工程代号为 Kestrel 的 JDK 1.3发布,JDK 1.3 相对于 JDK 1.2 的改进主要表现在一些类库上(如数学运算和新的 Timer API 等),JNDI 服务从 JDK 1.3 开始被作为一项平台级服务提供(以前 JNDI 仅仅是一项扩展),使用 CORBA IIOP 来实现 RMI 的通信协议,等等。这个版本还对 Java 2D 做了很多改进,提供了大量新的 Java 2D API,并且新添加了 JavaSound 类库。

  7) 2002年2月13日,JDK 1.4 发布,工程代号为 Merlin。JDK 1.4 是 Java 真正走向成熟的一个版本,Compaq、Fujitsu、SAS、Symbian、IBM 等著名公司都有参与甚至实现自己独立的 JDK 1.4。哪怕是在十多年后的今天,仍然有许多主流应用(Spring、Hibernate、Struts等)能直接运行在 JDK 1.4 之上,或者继续发布能运行在 JDK 1.4 上的版本。JDK 1.4 同样发布了很多新的技术特性,如正则表达式、异常链、NIO、日志类、XML 解析器和 XSLT 转换器等。

  8) 2004年9月30日,JDK 1.5 发布,工程代号 Tiger。从 JDK 1.2 以来,Java 在语法层面上的变换一直很小,而 JDK 1.5 在 Java 语法易用性上做出了非常大的改进。例如,自动装箱、泛型、动态注释、枚举、可变长参数、遍历循环(foreach 循环)等语法特性都是在 JDK 1.5 中加入的。在虚拟机和 API 层面上,这个版本改进了 Java 的内存模型(Java Memory Model, JMM)、提供了 java.util.concurrent 并发包等。另外,JDK 1.5 是官方声明可以支持 Window 9x 平台的最后一个 JDK 版本。

  9) 2006年12月11日,JDK 1.6 发布,工程代号 Mustang。在这个版本中,Sun 终结了从 JDK 1.2 开始已经有 8 年历史的 J2EE、J2SE、J2ME 的命名方式,启用 Java SE 6、Java EE 6、Java ME 6 的命名方式。JDK 1.6 的改进包括:提供动态语言支持(通过内置 Mozilla JavaScript Rhino 引擎实现)、提供编译 API 和微型 HTTP 服务器 API 等。同时,这个版本对 Java 虚拟机内部做了大量改进,包括锁与同步、垃圾收集、类加载等方面的算法都有相当多的改动。

  10) 在2006年11月13日的 JavaOne大会上,Sun 公司宣布最终会将 Java 开源,并在随后的一年多的时间内,陆续将 JDK 的各个部分在GPL v2(GNU General Public License v2) 协议下公开了源码,并建立了 OpenJDK 组织对这些源码进行独立管理。除了极少量的产权代码(Encumbered Code,这部分代码大多是 Sun 本身也无权限进行开元处理的)外,OpenJDK 几乎包括了 Sun JDK 的全部代码, OpenJDK 的质量主管曾经表示,在 JDK 1.7中,Sun JDK 和 OpenJDK 除了代码和文件头的版权只是之外,代码基本上完全一样,所以 OpenJDK 7 与 Sun JDK 1.7 本质上就是同一套代码库开发的产品。

  11) JDK 1.7 的主要改进包括:提供新的 G1 收集器(G1 在发布时依然处于 Experimental 状态,直至2014年4月的Update 4中才正式庄正)、加强对非 Java 语言的调用支持(ISR-292,这项特性到目前为止依然没有完全实现定型)、升级类加载架构等。

  12) 2009年4月20日,Oracle 公司收购了 Sun 公司,Java 商标从此正式归 Oracle 所有(Java 本身并不属于那间公司所有,他由 JCP 组织进行管理,尽管 JCP 主要是由 Sun公司或者说 Oracle 公司所领导的)。由于此前 Oracle 公司已经收购了另外一家大型的中间件企业 BEA 公司,在完成对 Sun 公司的收购之后, Oracle 公司分别送 BEA  和 Sun 中取得了目前三大商业虚拟机的其中两个:JRockit 和 HotSpot,Oracle 公司宣布在未来的1~2年的时间将把这两个优秀的虚拟机互相取长补短,最终合二为一。

1.4 Java 虚拟机发展史

  1) Sun Classic / Exact VM

    1996年1月23日,Sun 公司发布 JDK 1.0,Java 语言首次拥有了商用的正式运行环境,这个 JDK 中所带的虚拟机就是Classic VM。这款虚拟机只能使用纯解释器方式来执行 Java 代码,如果要使用 JIT 编译器,就必须进行外挂。但是假如外挂了 JIT 编译器,JIT 编译器就完全接管了虚拟机的执行系统,解释器变不再工作了。

    其他类似的外挂编译器还有 Symantec JIT 和 shuJIT 等。由于解释器和编译器不能配合工作,这就意味着如果要使用编译器执行,编译器就不得不对每一个方法、每一行代码都进行编译,而无论他们执行的频率是否具有编译的价值。基于程序响应时间的压力,这些编译器根本不敢应用编译耗时稍高的优化技术,因此这个阶段的虚拟机即使用了 JIT 编译器输出本地代码,执行效率也和传统的 C/C++ 程序有很大的差距。

    在 JDK 1.2 时,曾在 Solaris 平台上发布过一款名为 Exact VM 的虚拟机,他的执行系统已经具备现代高性能虚拟机的雏形:如两级即时编译器、编译器与解释器混合工作模式等。Exact VM 因它使用准确式内存管理(Exact Memory Management,也可以叫 Non-Conservative/Accurate Memory Management)而得名,即虚拟机可以知道内存中某个位置的数据具体是什么类型。由于使用了准确是内存管理,Exact VM 可以抛弃以前 Classic VM基于 handler 的对象查找方式(原因是进行 GC 后对象可能会被移动位置)。

    虽然 Exact VM 的技术相对 Classic VM 来说先进了许多,但是在商业应用上只存在了很短暂的时间就被更为优秀的 HotSpot VM 所取代,甚至还没来得及发布 Windows 和 Linux 平台下的商用版本。而Classic VM 的生命周期则相对长了许多,他在 JDK 1.2 之前是 Sun JDK 中唯一的虚拟机,在 JDK 1.2 时,他与 HotSpot VM 并存,但默认使用的是 Classic VM(用户可用 java-hotspot 参数切换至 HotSpot VM),而在 JDK 1.3 时,HotSpot VM 称为默认虚拟机,但 Classic VM 仍作为虚拟机的备用选择发布(使用 java-classic 参数切换),知道 JDK 1.4 的时候,Classic VM 才完全退出商用虚拟机的历史舞台,与 Exact VM 一起进入了 Sun Labs Research VM 之中。

  2) Sun HotSpot VM

    Sun HotSpot VM 是 Sun JDK 和 Open JDK 中所带的虚拟机,也是目前使用范围最广的 Java 虚拟机,这个虚拟机最初是由一家名为 "LongviewTechnologies" 的小公司设计的,最初并非是为 Java 语言而开发的,他来源于 Strongtalk VM,而这款虚拟机中相当多的技术又是来源于一款支持 Self 语言实现 "达到 C 语言50% 以上的执行效率"的目标而设计实现的虚拟机, Sun 公司于1997年收购了 Longview Technologies 公司,从而获得了 HotSpot VM。

    HotSpot VM 既继承了 Sun 之前两款商用虚拟机的优点,也有许多自己新的技术优势,如他名称中的 HotSpot 指的就是他的热点代码探测技术(其实两个 VM 基本上是同时期的独立产品,HotSpot 一开始就是准确式 GC,而 Exact VM 之中也有与 HotSpot 几乎一样的热点探测,为了 Exact VM 和 HotSpot VM 哪个称为 Sun主要支持的产品,在 Sun 公司内部还有过争论,HotSpot 打败 Exact VM 并不能算技术上的胜利),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。Oracle 公司宣布在不久的将来会完成这两款虚拟机的整合工作,使之优势互补。

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

原文地址:https://www.cnblogs.com/microcat/p/6642419.html