JVM--走进Java

1.1 概述java

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

 

1.2 Java技术体系算法

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

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

      Java 程序设计语言浏览器

      各类硬件平台上的 Java 虚拟机安全

      Class 文件格式ruby

      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 六、Java EE 六、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

相关文章
相关标签/搜索