这是一本介绍jvm书的概述把java介绍的还是比较全面了。刚开始 学习的同学可以好好的看先,哪些自己还不了解。
Java不仅仅是一门编程语言,它还是一个由一系列计算机软件和规范形成的技术体系,这个技术体系提供了完整的用于软件开发和跨平台部署的支持环境,并广泛应用于嵌入式系统、移动终端、企业服务器和大型机等各种场合,如图1-1所示。时至今日,Java技术体系已经吸引了600多万软件开发者,这是全球最大的软件开发团队。使用Java的设备多达几十亿台,其中包括8亿多台个人计算机、21亿部移动电话及其他手持设备、35亿个智能卡,以及大量机顶盒、导航系统和其他设备①。 Java能获得如此广泛的认可,除了因为它拥有一门结构严谨、面向对象的编程语言之外,还有许多不可忽视的优点:它摆脱了硬件平台的束缚,实现了“一次编写,到处运行”的理想;它提供了一种相对安全的内存管理和访问机制,避免了绝大部分的内存泄漏和指针越界问题;它实现了热点代码检测和运行时编译及优化,这使得Java应用能随着运行时间的增加而获得更高的性能;它有一套完善的应用程序接口,还有无数的来自商业机构和开源社区的第三方类库来帮助实现各种各样的功能……Java所带来的这些好处让程序的开发效率得到了很大的提升。作为一名Java程序员,在编写程序时除了尽情发挥Java的各种优势外,还应该去了解和思考一下Java技术体系中这些技术是如何实现的。认清这些技术的运作本质,是自己思考“程序这样写好不好”的基础和前提。当我们在使用一门技术时,如果不再依赖书本和他人就能得到这个问题的答案,那才算升华到了“不惑”的境界。
本书将会与读者一起分析Java技术中最重要的那些特性的实现原理。在本章中,我们将重点介绍Java技术体系所包括的内容,以及Java的历史、现在和未来的发展趋势。
1.2 Java技术体系
从广义上讲,Clojure、JRuby、Groovy等运行于Java虚拟机上的语言及其相关的程序都属于Java技术体系的一员。如果仅从传统意义上来看,Sun官方所定义的Java技术体系包括了以下几个组成部分: Java程序设计语言 各种硬件平台上的Java虚拟机 Class文件格式 Java API类库 来自商业机构和开源社区的第三方Java类库 我们可以把Java程序设计语言、Java虚拟机、Java API类库这三部分统称为JDK(Java Development Kit),JDK是用于支持Java程序开发的最小环境,在后面的内容中,为了讲解方便,有一些地方会以JDK来代替整个Java技术体系。
如果按照技术所服务的领域来划分,或者说按照Java技术关注的重点业务领域来划分,Java技术体系可以分为四个平台,分别为: Java Card:支持一些Java小程序(Applets)运行在小内存设备(如智能卡)上的平台。 Java ME(Micro Edition):支持Java程序运行在移动终端(手机、PDA)上的平台,对Java API有所精简,并加入了针对移动终端的支持,这个版本以前称为J2ME。 Java SE(Standard Edition):支持面向桌面级应用(如Windows下的应用程序)的Java平台,提供了完整的Java核心API,这个版本以前称为J2SE。 Java EE(Enterprise Edition):支持使用多层架构的企业应用(如ERP、CRM应用)的Java平台,除了提供Java SE API外,还对其做了大量的扩充①并提供了相关的部署支持,这个版本以前称为J2EE。
1.3 Java发展史
从第一个Java版本诞生到现在已经有16年的时间了。沧海桑田一瞬间,转眼16年过去了,在图1-3所展示的时间线中,我们看到JDK已经发展到了1.7版。在这16年里还诞生了无数和Java相关的产品、技术和标准。现在让我们进入时间隧道,从孕育Java语言的时代开始,再来回顾一下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技术的一些最基础的支撑点(如JDBC等)都是在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.1.4 - Sparkler(宝石)、JDK 1.1.5 - Pumpkin(南瓜)、JDK 1.1.6 - Abigail(阿比盖尔,女子名)、JDK 1.1.7- Brutus(布鲁图,古罗马政治家和将军)和JDK 1.1.8 - Chelsea(切尔西,城市名)。
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, Micro Edition)。在这个版本中出现的代表性技术非常多,如EJB、Java Plug-in、Java IDL、Swing等,并且在这个版本中Java虚拟机第一次内置了JIT(Just In Time)编译器(JDK 1.1也可以使用外挂方式的JIT编译器)。在语言和API级别上,Java添加了strictfp关键字与现在Java编码之中极为常用的一系列Collections集合类。在1999年3月和7月,分别有JDK 1.2.1和JDK 1.2.2两个小版本发布。 1999年4月27日,HotSpot虚拟机发布,HotSpot最初由一家名为“Longview Technologies”的小公司开发,因为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服务从JDK 1.3开始被作为一项平台级服务提供(以前JNDI仅仅是一项扩展),使用CORBA IIOP来实现RMI的通讯协议,等等。这个版本还对Java 2D做了很多改进,提供了大量新的Java 2D API,并且新添加了JavaSound类库。JDK 1.3有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。哪怕是在近10年后的今天,仍然有许多主流应用(Spring、Hibernate、Struts等)能直接运行在JDK 1.4之上,或者继续发布能运行在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.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是官方声明可以支持Windows 9x平台的最后一个JDK版本。
2006年12月11日,JDK 1.6发布,工程代号为Mustang(野马)。这是目前为止最新的正式版JDK(截至本书完稿时,JDK 1.7仍然处于Early Access版本)。在这个版本中,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虚拟机的内部做了大量改进,包括锁与同步、垃圾收集、类加载等方面的算法都有相当多的改动。 在2006年11月13日的JavaOne大会上,Sun宣布最终会把Java开源,并在随后的一年多时间内,陆续地在GPL v2(GNU General Public License v2)协议下公开了JDK各个部分的源码,并建立了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到今天为止一共发布了25个Update,最新的版本为Java SE 6 Update 25,于2011年4月21日发布。 2009年2月19日,工程代号为Dolphin(海豚)的JDK 1.7完成了其第一个里程碑版本。根据JDK 1.7的功能规划,一共设置了10个里程碑。最后一个里程碑版本于2010年9月9日结束。从发布的Early Access版看来目前JDK 1.7的主体功能,已经比较完善,只剩下Lambda项目(Lambda表达式)、Jigsaw(模块化支持)和Coin(语言细节进化)子项目的部分工作尚未完成,Oracle宣布JDK 1.7正式版将于2011年7月28日推出,可能会①把不能按时完成的Lambda、Jigsaw和部分Coin放入JDK 1.8之中。JDK 1.7的主要改进包括:提供新的G1收集器、加强对非Java语言的调用、语言级的模块化支持(取决于Jigsaw项目能不能完成)、升级类加载架构,等等。 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技术体系将会产生相当巨大的变化。