1.1 Java发展的艰辛历程

自1995年至今,Java语言已经在编程领域内经历了数十年的发展和升华。Java作为一门长期霸占编程领域排行榜前三名的语言,被创造出来之时似乎并没有想到会有今日的辉煌,它可能只是比别人早走了一步。但我们重温历史,再仔细地分析一下,Java编程语言为什么能够从无数的编程语言当中脱颖而出,并不是有意而为之的,甚至高斯林创造它也根本不是为了解决我们今天所遇到的问题!可以说是“有意栽花花不发,无心插柳柳成荫”,但它发挥的价值却远比当初的预期更加深远。接下来,就让我们穿越回去翻开历史的篇章,看一下Java发展过程中的各个版本及里程碑节点的运行轨迹。

1990年到1991年初,“Java语言之父”詹姆斯·高斯林带领他的开发团队进行了一项名为“绿色工程(Green Project)”的项目。该项目最初主要面向智能家电领域,如智能电话、智能电视和智能微波炉等,其使用的程序便是Java的前身:Oak,但是当时其发展并不太尽如人意。

1995年Oak更名为Java,“Java”这个名称来源于印尼的爪哇岛,又因为爪哇岛凭借雀巢咖啡出名,所以Java的logo也就是咖啡杯的形状。同年,Sun公司正式推出了Java语言的第一个版本(Java 1.0),但是它当时还并不成熟,如果要实现更加强大的功能和服务,还需要扩展更多的体系和底层库。

1996年初,继首个Java官方版本推出之后,官方又正式推出了有史以来首个Java虚拟机(Java Virtual Machine ,JVM),并且命名为Sun Classic vm。此外,Java结构体系中划分了两个部分:JRE(Java程序运行环境)和JDK(Java编程开发应用工具箱),其中JRE又包含了基础类库的应用技术API、基础核心技术应用程序API、扩展技术应用API,以及用户图形化界面的API和JVM 5个部分,但此时它还并不完整。

1997年JDK 1.1发布,其扩展增加的技术点主要有系统支持Jar包的加载及解析功能,同时还有打包功能;Java数据库连接JDBC(Java Databate Connetivity)机制;JavaBeans功能体系、RMI(远程方法调用)等。JDK 1.1与初代JDK相比,最大进步就是拥有了非常强大的编译器:JIT编译器(即时编译器)。JIT编译器非常智能化,其会动态地计算和采集方法的调用信息,把经常调用的热点方法指令提前编译完成后,保存在JVM内存内,这样就会形成优化体系,等待再次执行此段程序时,就不再进行编译处理,大大提高了性能。

1998年12月初,官方发布了第二个意义重大的JDK版本,也就是著名的JDK 1.2,其工程代号为“运动场”,JDK 1.2包含3个JDK方向,即 Java SE(标准版)、Java EE(企业级)和Java 2 ME (移动端)。

1999年HotSpot虚拟机诞生,其由Sun公司旗下的Longview Technologies公司开发。

2000年JDK 1.3正式发布,其工程代号为“红隼”。JDK 1.3引入了新版的虚拟机,即1999年发布的HotSpot虚拟机,以及RMI、JDDI和JPDA等扩展库。

2002年2月,JDK 1.4发布,同时它也是JCP组织建立的第一个官方性质的版本,其项目代号为“灰背隼”(Merlin)。JDK 1.4有各大巨头加盟(如Compaq、Fukitsu、SAS、Symbian、IBM等),其有正则表达式、断言机制、异常Chain机制、NIO、日志应用接口、XML等功能,属于较为成熟的版本。此外,JDK 1.4版本还有两个修订版本,分别是在2002年9月发布的“草蜢”版本(JDK 1.4.1)和2003年6月发布的“螳螂”版本(JDK 1.4.2)。

2004年9月30日,JDK 1.5发布,人们经常称之为Java 5或者Java SE 5,其工程代号为“老虎”。从这个版本开始,官方逐渐将JDK版本号改为5.0、6.0或7.0这种命名规范。JDK 1.5新增功能包含拆装箱、动态可变参数(variable parameter)、动态注解(dynamic annotation)、遍历循环(for-each)、枚举(enum)、泛型(generic type)等,此外它还升级和优化了JMM(JVM Memory Model-JVM内存模型)体系。

2006年JDK 6正式发布,其工程代号为“野马”,提供初步动态语言的支持、微型动态语言的支持、脚本语言的支持、WebService的支持、JDBC 4.0的支持等功能,此外还提供了Java编译器的API。JDK 6在虚拟机层面上,提供了锁同步机制的优化、编译器性能的优化及垃圾回收算法的优化等。同年,Sun公司将Java源码进行开源,开源的版本称为Open JDK。

继IBM公司并购失利之后,在2009年4月,Oracle(甲骨文)公司终于成功以总市值74亿美元对Sun公司进行了并购,至此Java的商标正式属于Oracle公司。但是,Java语言并非由Sun公司或Oracle公司直接进行管理,而是由它们旗下的JCP组织进行管理。

JDK 7是一个很重要的版本,其工程代号为“海豚”,正式版是在2011年7月发布的。原本规划中有很多业界翘首期盼的项目,如Coin工程计划(Java语法细节优化)、动态语言特性、 G1回收器、Lambda功能的支持(行为参数化、闭包特性和Lambda表达式等)、函数化接口(Function In-terface)、Jigsaq项目、对Java虚拟机JVM层面的模块化支持等。但在Oracle收购Sun公司后,为了不延迟JDK 7正式版的发行,砍掉了Lambda、Jigsaw和Coin项目。

最终,原计划在JDK 7中包含的主要更新:全新的G1回收器、对非Java编程生态的扩展、可并行的类加载结构等,推迟到JDK 8版本的开发计划中。

2014年3月JDK 8推出,其补充了许多原本计划在JDK 7中新升级的功能:对Lambda表达式支持;因DateFormat及Date功能的缺点和漏洞,出现了新的管理日期及时间的API;改变了方法区的实现机制,去除了之前的永久代(Permanent Generation),取而代之的是元空间(Metaspace);使用Nashorn引擎取代Rhino引擎,成为Java中嵌入式的JavaScript引擎。

2017年JDK 9发布,其专门优化了Jigsaw项目,还对很多工具组件进行了升级,包括:JHSDB、JLink、JShell等,并重新规划了JVM的日志体系等。此外,官方规定了以6个版本为间隔单位,作为长期支持LTS(Long-Term Support)版本的约定,也就是说继JDK 11之后JDK 17也会属于LTS版本。

2018年3月JDK 10发布,内部重构和统一源仓库、统一垃圾回收器接口、统一即时编译器接口。

2018年10月JDK 11发布,其加入了革命性的ZGC回收器。Oracle将JDK 11分为Open JDK 11和Oracle JDK 11两个版本,其功能基本一样,差别在于前者对使用开发没有限制,只有半年更新支持,而后者需要商业收费。

2019年3月JDK 12版本发布,其支持很多新的特性,包括switch关键字可以支持Lambda表达式、加强版ZGC回收器(Shenandoah GC)、Java微测试套件等。

2019年9月JDK 13版本发布,基于之前JDK 10到12的版本中实现的JVM进程之间进行共享核心类(启动类加载器所加载的类,以及一些应用级别的类加载器加载的类)的归档化机制,此版本中实现了动态化归档机制,实现Java程序执行结束后进行动态归档功能。同时还增强了ZGC的动态化释放堆空间内存机制,比如,当一些内存空间较长时间没有被程序所使用时,ZGC可以自动化将这些内存资源交还给底层操作系统,从而不会造成资源浪费。还重写了SocketAPI的实现,新增的Ni-oSocketImpl类可以代替原有的SocketAPI实现类,但是原有的SocketAPI实现类仍然有效。

2020年3月,官方正式发布JDK的第14个版本,它包含G1回收器的底层改造(NUMA架构模型中的嗅探感知内存区域的分配,还可以适配其他操作系统,如MacOS和Windows等);剔除了标记-清除回收器(CMS);基于Event Flow的JFR处理方式的调整和包装工具箱等,更多特性可以参考官网信息。

至此,Java语言的发展历程已经基本介绍完,希望读者在未来的学习中不要只停留在技术层面上,对它未来的发展方向也应该多多关注,这样才会在Java的世界里走得更远,飞得更高。