Java 技术体系
本次session内容均来自深入理解java虚拟机这本书。
JCP官方所定义的Java技术体系包括了以下几个组成部分:
·Java程序设计语言
·各种硬件平台上的Java虚拟机实现
·Class文件格式
·Java类库API
·来自商业机构和开源社区的第三方Java类库我们可以把Java程序设计语言、Java虚拟机、Java类库这三部分统称为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各个组成部分的功能来进行划分,如果按照技术所服务的领域来划分,或者按照技术关注的重点业务来划分的话,那Java技术体系可以分为以下四条主要的产品线:
·Java Card:支持Java小程序(Applets)运行在小内存设备(如智能卡)上的平台。
·Java ME(Micro Edition):支持Java程序运行在移动终端(手机、PDA)上的平台,对Java API有所精简,并加入了移动终端的针对性支持,这条产品线在JDK6以前被称为J2ME。有一点读者请勿混淆,现在在智能手机上非常流行的、主要使用Java语言开发程序的Android并不属于Java ME。
·Java SE(Standard Edition):支持面向桌面级应用(如Windows下的应用程序)的Java平台,提供了完整的Java核心API,这条产品线在JDK 6以前被称为J2SE。
·Java EE(Enterprise Edition):支持使用多层架构的企业应用(如ERP、MIS、CRM应用)的Java平台,除了提供Java SE API外,还对其做了大量有针对性的扩充[插图],并提供了相关的部署支持,这条产品线在JDK 6以前被称为J2EE,在JDK10以后被Oracle放弃,捐献给Eclipse基金会管理,此后被称为Jakarta EE。
Java发展史
JDK 1.0版本的代表技术包括:Java虚拟机、Applet、AWT等。
JDK 1.1版的技术代表有:JAR文件格式、JDBC、JavaBeans、RMI等。Java语言的语法也有了一定的增强,如内部类(Inner Class)和反射(Reflection)都是在这时候出现的。
JDK 1.2把Java技术体系拆分为三个方向,分别是面向桌面应用开发的J2SE、面向企业级开发的J2EE、和面向手机等移动终端开发的J2ME。在这个版本中出现的代表性技术非常多,如EJB、Java Plug-in、Java IDL、Swing等,并且这个版本中Java虚拟机第一次内置了JIT(Just In Time)即时编译器(JDK 1.2中曾并存过三个虚拟机,Classic VM、HotSpot VM和Exact VM,其中Exact VM只在Solaris平台出现过;后面两款虚拟机都是内置了JIT即时编译器的,而之前版本所带的Classic VM只能以外挂的形式使用即时编译器)。Java类库添加了现在Java编码之中极为常用的一系列Collections集合类等。Hot-Spot虚拟机刚发布时是作为JDK 1.2的附加程序提供的,后来它成为JDK 1.3及之后所有JDK版本的默认Java虚拟机。
JDK 1.3的改进主要体现在Java类库上(如数学运算和新的Timer API等)。
JDK 1.4同样带来了很多新的技术特性,如正则表达式、异常链、NIO、日志类、XML解析器和XSLT转换器,
JDK 5 Sun公司从这个版本开始放弃了谦逊的“JDK 1.x”的命名方式。在Java语法易用性上做出了非常大的改进。如:自动装箱、泛型、动态注解、枚举、可变长参数、遍历循环(foreach循环)等语法特性都是在JDK 5中加入的。改进了Java的内存模型,提供了java.util.concurrent并发包等
JDK 6提供初步的动态语言支持(通过内置Mozilla JavaScript Rhino引擎实现)、提供编译期注解处理器和微型HTTP服务器API。同时,这个版本对Java虚拟机内部做了大量改进,包括锁与同步、垃圾收集、类加载等方面的实现都有相当多的改动。
同年sun公司宣布Java开源,后来的openjdk7与sun jdk7几乎一样。JDK 6发布以后,由于代码复杂性的增加、Java开源、开发JavaFX、世界经济危机及Oracle对Sun的收购案等原因,Java7延期几年,很多预计feature也都没有实现。还有一些瓜就不吃了,后来把大部分预定功能砍了,仓促发布jdk7。
JDK 7包含的改进有:提供新的G1收集器(G1在发布时依然处于Experimental状态,直至2012年4月的Update 4中才正式商用)、加强对非Java语言的调用支持(JSR-292,这项特性在到JDK 11还有改动)、可并行的类加载架构等。
JDK 8 对Lambda表达式的支持,内置Nashorn JavaScript引擎的支持,新的时间、日期API,彻底移除HotSpot的永久代。
JDK9总算是带着Jigsaw最终发布了,除了Jigsaw外,JDK 9还增强了若干工具(JSShell、JLink、JHSDB等),整顿了HotSpot各个模块各自为战的日志系统,支持HTTP 2客户端API等91个JEP。
Oracle随即宣布Java将会以持续交付的形式和更加敏捷的研发节奏向前推进,以后JDK将会在每年的3月和9月各发布一个大版本。Oracle的解决方案是顺理成章地终结掉“每个JDK版本最少维护三年”的优良传统,从此以后,每六个JDK大版本中才会被划出一个长期支持(Long Term Support,LTS)版,只有LTS版的JDK能够获得为期三年的支持和更新,普通版的JDK就只有短短六个月的生命周期。JDK 8和JDK 11会是LTS版,再下一个就到2021年发布的JDK 17了。
JDK 10如期发布,这版本的主要研发目标是内部重构,诸如统一源仓库、统一垃圾收集器接口、统一即时编译器接口(JVMCI在JDK 9已经有了,这里是引入新的Graal即时编译器)等,本地类型变量推断。
JDK 11发布,这是一个LTS版本的JDK,包含17个JEP,其中有ZGC这样的革命性的垃圾收集器出现。
JDK 12发布,只包含8个JEP,其中主要有Switch表达式、Java微测试套件(JMH)等新功能,最引人注目的特性无疑是加入了由RedHat领导开发的Shen-andoah垃圾收集器。Shenandoah作为首个由非Oracle开发的垃圾收集器,其目标又与Oracle在JDK 11中发布的ZGC几乎完全一致,随后无情被砍。
未来:Graal VM、Valhalla、Amber、Loom、Panama等面向未来的研究项目。
Graal VM可以无额外开销地混合使用Java、Scala、Groovy、Kotlin、C、C++、Rust等编程语言,支持不同语言中混用对方的接口和对象,也能够支持这些语言使用已经编写好的本地库文件。
HotSpot虚拟机中含有两个即时编译器,分别是编译耗时短但输出代码优化程度较低的客户端编译器(简称为C1)以及编译耗时长但输出代码优化质量也更高的服务端编译器(简称为C2),通常它们会在分层编译机制下与解释器互相配合来共同构成HotSpot虚拟机的执行子系统(这部分具体内容将在本书第11章展开讲解)。自JDK 10起,HotSpot中又加入了一个全新的即时编译器:Graal编译器。
提前编译是相对于即时编译的概念,提前编译能带来的最大好处是Java虚拟机加载这些已经预编译成二进制库之后就能够直接调用,而无须再等待即时编译器在运行时将其编译成二进制机器码。
笔者将语言的功能特性和语法放到最后来讲,因为它是相对最不重要的改进点,毕竟连JavaScript这种“反人类”的语法都能获得如此巨大的成功,而比Java语法先进优雅得多的挑战者C#现在已经“江湖日下”,成了末路英雄。