《深入理解java虚拟机》第1章 走近Java

世界上并没有完美的程序,但我们并不因此而沮丧,因为写程序本来就是-一个 不断追求完美的过程。

1.1 概述

Java不仅仅是一- ]编程语言,还是一一个由一系列计算机软件和规范形成的技术体系,这个技术体系提供了完整的用于软件开发和跨平台部署的支持环境,并广泛应用于嵌人式系统、移动终端、企业服务器、大型机等各种场合,如图1-1所示。时至今日,Java 技术体系
已经吸引了900多万软件开发者,这是全球最大的软件开发团队。使用Java的设备多达几十亿台,其中包括11亿多台个人计算机、30 亿部移动电话及其他手持设备、数量众多的智能卡,以及大量机顶盒、导航系统和其他设备。

Java能获得如此广泛的认可,除了它拥有一门结构严谨、面向对象的编程语言之外, 还有许多不可忽视的优点:它摆脱了硬件平台的束缚,实现了“一 -次编写,到处运行”的理想;它提供了一个相对安全的内存管理和访问机制,避免了绝大部分的内存泄露和指针越界问题:它实现了热点代码检测和运行时编译及优化,这使得Java应用能随着运行时间的增加而获得更高的性能;它有一套完善的应用程序接口,还有无数来自商业机构和开源社区的第三方类库来帮助它实现各种各样的功能...av.所带来的这些好处使程序的开发效率得到了很大的提升。作为- -名Java程序员,在编写程序时除了尽情发挥Java的各种优势外,还应该去了解和思考一下Java技术体系中这些技术特性是如何实现的。认识这些技术运作的本质,是自己思考“程序这样写好不好”的基础和前提。当我们在使用一-种技术时,如果不再依赖书本和他人就能得到这些问题的答案,那才算上升到了“不惑”的境界。
本书将与读者- -起分 析Java技术中最重要的那些特性的实现原理。在本章中,我们将重点介绍Java技术体系内容以及Java的历史、现在和未来的发展趋势。

1.2 Java技术体系

从广义上讲,Clojure、 JRuby、 Groovy 等运行于Java虚拟机上的语言及其相关的程序都属于Java技术体系中的-一员。如果仅从传统意义上来看,Sun 官方所定义的Java技术体系包
括以下几个组成部分:

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

我们可以把Java程序设计语言、Java 虚拟机、Java API类库这三部分统称为JDK (Java ,Development Kit), JDK是用于支持Java程序开发的最小环境,在后面的内容中,为了讲解方便,有一些地方会以JDK来代替整个Java技术体系。另外,可以把Java API类库中的Java SE API子集和Java虚拟机这两部分统称为JRE (Java Runtime Environment), JRE 是支持Java程序运行的标准环境。图1-2展示了Java 技术体系所包含的内容,以及JDK和JRE所涵盖的范围。

《深入理解java虚拟机》第1章 走近Java

以上是根据各个组成部分的功能来进行划分的,如果按照技术所服务的领域来划分,或者说按照Java技术关注的重点业务领域来划分,Java 技术体系可以分为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, Java EE ( Enterprise Edition) :支持使用多层架构的企业应用(如ERP、CRM应用)的Java平台,除了提供Java SE API外,还对其做了大量的扩充*并提供了相关的部署支持,这个版本以前称为J2EE。

1.3Java发展史

从第一一个Java版本诞生到现在已经有18年的时间了。沧海桑田- -瞬间,转眼18年过去了,在图1-3所展示的时间线中,我们看到JDK已经发展到了1.7版。在这18年里还诞生了无数和Java相关的产品、技术和标准。现在让我们走人时间隧道,从孕育Java语言的时
代开始,再来回顾- -下Java的发展轨迹和历史变迁。

《深入理解java虚拟机》第1章 走近Java

 

1991年4月,由James Gosling博士领导的绿色计划( Green Project)开始启动,此计划的目的是开发- -种能够在各种消费性电子产品(如机顶盒、冰箱、收音机等),上 运行的程序架构。这个计划的产品就是Java语言的前身: Oak (橡树)。Oak当时在消费品市场上并不算成功,但随着1995年互联网潮流的兴起,Oak迅速找到了最适合自己发展的市场定位并蜕变成为Java语言。1995年5月23日,Oak语言改名为Java,并且在SunWorld大会上正式发布Java1.0版本。Java 语言第- -次提出了“Write Once,Run Anywhere”的口号。1996年1月23日,JDK 1.0发布,Java 语言有了第一个正式版本的运行环境。JDK 1.0提供了一个纯解释执行的Java虚拟机实现( Sun Classic VM)。JDK 1.0版本的代表技术包括:
Java虚拟机、Applet、 AWT等。
1996年4月,10个最主要的操作系统供应商申明将在其产品中嵌人Java技术。同年9月,已有大约8.3万个网页应用了Java技术来制作。在1996年5月底,Sun公司于美国旧金;山举行了首届JavaOne大会,从此JavaOne成为全世界数百万Java 语言开发者每年- -度的技术盛会。

1997年2月19日,Sun公司发布了JDK 1.1,Java 技术的一- 些最基础的支撑点(如JDBE等)都是在JDK 1.1 版本中发布的,JDK 1.1版的技术代表有: JAR文件格式、JDBC、.JavaBeans、RMI。Java 语法也有了一-定的发展,如内部类(Inner Class)和反射( Reflection)
都是在这个时候出现的。直到1999年4月8日,JDK 1.1-共发布了1.1.0~ 1.1.8-九个版本。从1.1.4之后,每个JDK版本都有- -个自己的名字(正程代号),分别为: JDK 1.F4 - Sparklee (宝石)、JDK1.1.5 - Pumpkin (南瓜)、JDK 1.1.6- Abigail (阿比盖尔,女子名)、JDK 1.1.7- Brutus (布鲁图, 古罗马政治家和将军)和JDK 1.1.8- CheIsea (切尔西,城市名)。

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

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

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

自从JDK 1.3开始,Sun维持了一-个习惯:大约每隔两年发布-一个JDK的主版本,以动物命名,期间发布的各个修正版本则以昆虫作为工程名称。
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转换器等。JDK 1.4有两个后续修正版: 2002年9 月16日发布的工程代号为Grasshopper (蚱蜢)的JDK 1.4.1 与2003年6月26日发布的工程代号为Mantis (螳螂)的JDK 1 .4.2。2002年前后还发生了一-件与Java没有直接关系,但事实上对Java的发展进程影响很大的事件,那就是微软公司的.NET Framework发布了。这个无论是技术实现上还是目标用户上都与Java有很多相近之处的技术平台给Java带来了很多讨论、比较和竞争,.NET 平台和.Java平台之间声势浩大的孰优孰劣的论战到目前为止都在继续。

2004年9月30日,JDK 1.59发布,工程代号Tiger (老虎)。从JDK 1.2以来,Java 在语法层面上的变换- -直很小,而JDK 1.5在Java语法易用性上做出了非常大的改进。例如,自动装箱、泛型、动态注解、枚举、可变长参数、遍历循环( foreach循环)等语法特性都是在JDK 1.5 中加入的。在虚拟机和API层面上,这个版本改进了Java的内存模型(JavaMemory Model, JMM)、 提供了java.util.concurrent 并发包等。另外,JDK 1.5 是官方声明可以支持Windows 9x平台的最后-一个 JDK版本。2006年12月11日,JDK1.6发布,工程代号Mustang(野马)。在这个版本中,Sun终结了从JDK 1.2开始已经有8年历史的J2EE、J2SE、 J2ME的命名方式,启用Java SE6、Java EE 6、Java ME 6的命名方式。JDK 1.6的改进包括:提供动态语言支持(通过内置Mozilla JavaScript Rhino引擎实现)、提供编译API和微型HTTP服务器API等。同时,这个版本对Java虚拟机内部做了大量改进,包括锁与同步、垃圾收集、类加载等方面的算法都有相当多的改动。
在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本质上就是同-套代码库开发的产品。JDK 1.6 发布以后,由于代码复杂性的增加、JDK开源、开发JavaFX、经济危机及Sun收购案等原因,Sun在JDK发展以外的事情上耗费了很多资源,JDK的更新没有再维持两年发布一个主版本的发展速度。JDK 1.6到目前为止-共发布了37个Update版本,最新的版本为Java SE 6 Update37,于2012年10月16 日发布。

2009年2月19 日,工程代号为Dolphin(海豚)的JDK 1.7 完成了其第- -个里程碑版本。根据JDK1.7的功能规划,--共设置了10个里程碑。最后一个里程碑版本原计划于2010年9月9日结束,但由于各种原因,JDK 1.7最终无法按计划完成。从JDK 1.7 最开始的功能规划来看,它本应是一一个包含许多重要改进的JDK版本,其中的Lambda项目(Lambda 表达式、函数式编程)、Jigsaw 项目( 虚拟机模块化支持)、动态语言支持、GarbageFirst 收集器和Coin项目(语言细节进化)等子项目对于Java业界都会产生深远的影响。在JDK1.7开发期间,Sun公司由于相继在技术竞争和商业竞争中都陷人泥潭,公司的股票市值跌至仅有高峰时期的3%,已无力推动JDK1.7的研发工作按正常计划进行。为了尽快结束JDK1.7长期“跳票”的问题,Oracle公司收购Sun公司后不久便宣布将实行“B计划”,大幅裁剪了JDK 1.7预定目标,以便保证JDK 1.7的正式版能够于2011年7月28日准时发布。“B计划”把不能按时完成的Lambda项目、Jigsaw项目和Coin项目的部分改进延迟到JDK 1.8之中。最终,JDK 1.7 的主要改进包括:提供新的G1收集器(G1在发布时依然处于Experimental状态,直至2012年4月的Update 4中才正式“转正”)、加强对非Java语言的调用支持(JSR-292, 这项特性到目前为止依然没有完全实现定型)、升级类加载架构等。

到目前为止,JDK 1.7 已经发布了9个Update版本,最新的Java SE 7 Update 9于2012年10月16日发布。从JavaSE7Update4起,Oracle开始支持MacOSX操作系统,并在Update6中达到完全支持的程度,同时,在Update6中还对ARM指令集架构提供了支持。
至此,官方提供的JDK可以运行于Windows (不含Windows 9x)、Linux、 Solaris 和Mac OS平台上,支持ARM、x86、x64 和Sparc指令集架构类型。2009年4月20日,Oracle 公司宣布正式以74亿美元的价格收购Sun公司,Java 商标从此正式归Oracle所有(Java 语言本身并不属于哪间公司所有,它由JCP组织进行管理,尽管JCP主要是由Sun公司或者说Oracle公司所领导的)。由于此前Oracle公司已经收购了另外一.家大型的中间件企业BEA公司,在完成对Sun公司的收购之后,Oracle公司分别从BEA和Sun中取得了目前三大商业虚拟机的其中两个:JRockit和HotSpot,Oracle公司宣布在未来1~ 2年的时间内,将把这两个优秀的虚拟机互相取长补短,最终合二为一-日。 可以预见在不久的将来,Java 虚拟机技术将会产生相当巨大的变化。根据Oracle官方提供的信息,JDK 1.8的第-一个正式版本将于2013年9月发布,JDK 1.8将会提供在JDK1.7中规划过,但最终未能在JDK1.7中发布的特性,即Lambda表达式、Jigsaw (很不幸,随后Oracle公司又宣布Jigsaw在JDK 1.8 中依然无法完成,需要延至JDK1.9) 和JDK 1.7中未实现的一部分Coin等。

在2011年的JavaOne大会上,Oracle 公司还提到了JDK 1.9 的长远规划,希望未来的Java虚拟机能够管理数以GB计的Java堆,能够更高效地与本地代码集成,并且令Java虚拟机运行时尽可能少人工干预,能够自动调节。

日JDK 1.7的Java SE API范围: http://download.oracle.com/javase/7/docs/api