探秘 JAVA 诞生之路,引领编程人生的宏伟著作

2023-12-13 19:17:18

目录

一. 前言

二. Java 发展史

2.1. 1990年年末

2.2. 1991年

2.3. 1992年夏天

2.4. 1994年

2.5. 1995年

2.6. 1996年(JDK1.0)

2.7. 1997年(JDK1.1)

2.8. 1998年(JDK1.2)

2.9. 1999年(HotSpot)

2.10. 2000年(JDK1.3)

2.11. 2002年(JDK1.4)

2.12. 2004年(JDK5)

2.13. 2005年

2.14. 2006年(JDK6)

2.15. 2009年

2.16. 2011年(JDK7)

2.17. 2014年(JDK8)

2.18. 2017年(JDK9)

2.19. 2018年(JDK10、JDK11)

2.20. 2019年(JDK12、JDK13)

2.21. 2020年(JDK14、JDK15)

2.22. 2021年(JDK16、JDK17)

2.23. 2022年(JDK18、JDK19)

2.24. 2023年(JDK20、JDK21)

三. 总结


一. 前言

? ? Java 是一门面向对象的编程语言,不仅吸收了 C++ 语言的各种优点,还摒弃了 C++ 里难以理解的多继承、指针等概念,因此 Java 语言具有功能强大和简单易用两个特征。Java 语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。

? ? 说起 Java 大家都知道,Java 具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点。Java 可以编写桌面应用程序、Web 应用程序、分布式系统和嵌入式系统应用程序等,那么 Java 语言发展历程你了解过吗?今天我们就来详细的聊一聊!

? ? Java 的发展史可以追溯到1991年,当时 James Gosling 在 Sun Microsystems 开发了一种新的编程语言,该语言后来被命名为 Java。在随后的几年里,Java 不断发展和完善,并逐渐成为了一种广泛应用于企业级应用程序开发的主流编程语言。

? ? 在 Java 的发展过程中,Sun Microsystems 一直致力于不断推进 Java 的性能和安全性,并在1998年将 Java 发布到了 Java 开放源代码社区,使得 Java 得以不断发展和完善。现在,Java 已经成为了全球最流行的编程语言之一,广泛应用于 Web 应用程序、移动应用程序、桌面应用程序和企业级应用程序等各种领域。

? ? 今天,Java 已经发展为世界上最流行和最受欢迎的编程语言之一,每年有超过数以万计的人在学习 Java 或从事 Java 开发相关的工作。毋庸置疑,Java 技术已经深入各行各业。

二. Java 发展史

2.1. 1990年年末

? ? 1990 年年末, Sun 公司预料嵌入式系统将在未来家用电器领域大显身手。于是 Sun 公司成立了一个由 James Gosling(詹姆斯·高斯林)领导的“Green计划 ”,准备为下一代智能家电(电视机、微波炉、电话)编写一个通用控制系统。

詹姆斯·高斯林 (James Gosling)是一名软件专家,1955年5月19日出生于加拿大,Java编程语言的共同创始人之一,一般公认他为“Java之父”。

2.2. 1991年

? ? 1991年5月,该系统由 Sun 公司的一个小工程师团队在设计和开发。该团队称自己为绿队(Green Term),团队成员有 James Gosling、Mike Sheridan、 Patrick Naughton 等人。James Gosling(詹姆斯·高斯林)是项目负责人。

? ? 该团队最初考虑使用 C++ 语言,但是很多成员包括 Sun 的首席科学家 Bill Joy,发现 C++ 和可用的 API 在某些方面存在很大的问题。而且工作小组使用的是嵌入式平台,可用的系统资源极其有限。并且很多成员都发现 C++ 太复杂,以致很多开发者经常错误使用。而且 C++ 缺少垃圾回收系统、可移植性、分布式和多线程等功能。

? ? 根据可用的资金,Bill Joy 决定开发一种新语言,他提议在 C++ 的基础上,开发一种面向对象的环境。于是,Gosling 试图通过修改和扩展 C++ 的功能来满足这个要求,但是后来他放弃了。他决定创造一种全新的语言:Oak(橡树,Java 的前身)。

2.3. 1992年夏天

? ? 到了 1992 年的夏天, Green 计划已经完成了新平台的部分功能,包括 Green 操作系统。Oak的程序设计语言、类库等。同年11月,Green 计划被转化成“FirstPerson有限公司”,一个 Sun 公司的全资子公司。

? ? FirstPerson 团队致力于创建一种高度互动的设备。当时代华纳公司发布了一个关于电视机顶盒的征求提议书时,FirstPerson 团队改变了他们的目标,作为对征求提议书的响应,提出了一个机顶盒平台的提议。

但是有线电视业界觉得 FirstPerson 的平台给予用户过多的控制权,因此 FirstPerson 的投标败给了 SGI。同时,3DO 公司另外一笔关于机顶盒的交易没有成功。此时,可怜的 Green 项目几乎接近夭折,甚至 Green 项目的一半成员也被调到了其他的项目组。

正如古代的寓言所言:塞翁失马,焉知非福?如果 Green 项目在机顶盒平台投标成功,也许就不会诞生 Java 这门伟大的语言了。

2.4. 1994年

? ? 1994年夏天, 互联网和浏览器的出现不仅给广大互联网的用户带来了福音,也给Oak语言带来了新的生机。Gosling立即意识到,这是一个机会,于是对Oak进行了小规模的改造。

? ? 到了1994年秋,小组中的 Naughton(诺顿)和 Jonathan Payne(乔纳森·佩恩)完成了第一个Java 语言的网页浏览器:WebRunner。Sun 公司实验室主任 Bert Sutherland(伯特·萨瑟兰)和技术总监 Eric Schmict(埃里克·施密特)观看了该浏览器的演示,对该浏览器的效果给予了高度评价。

2.5. 1995年

? ? 1995年当时在美国的硅谷有一个大会,号称是全球最顶尖的软件和硬件厂商都会在这个大会展示自家的产品,那么 Sun 公司的负责人 James Gosling 也带着他的 Oak 项目去展示了。参会时一个偶然的机会让他发现他的项目名字早已被人注册商标了,没办法了只能重新给 Oak 取一个新的名字(早在国外的时候人们对于版权看的非常重要)。James Gosling 和他的团队经过讨论后最终决定重命名为 Java(爪哇,是印度尼西亚生产第一杯咖啡的一个岛屿名称。因为当时美国非常多的人喜欢喝咖啡)。同年 Sun 公司正式公开发布 Java 语言(只是面世,还没有进行开发工具包JDK 的发布,大家还无法使用),并且第一次提出了“Write Once,Run Anywhere”(WORA,一次编写,到处运行)的口号。《时代》杂志将 Java 评为了1995年十大最佳产品之一。

? ? Sun 公司在1995年年初发布了 Java 语言,Sun 公司直接把 Java 放到互联网上,免费给大家使用,甚至连源代码也不保密,也放到互联网上向所有人公开。几个月后,让所有人都吃惊的事情发生了:Java 成了互联网上最热门的宝贝。竟然有10万多人次访问了 Sun 公司的网页,下载了 Java 语言。然后,互联网上立即就有了数不清的 Java 小程序(也就Applet),演示着各种小动画、小游戏等。

? ? Java 语言终于眼眉吐气了 ,成为了一种广为人知的编程语言。在 Java 语言出现之前,互联网的网页实质上就像一张纸,不会有任何动态的内容。有了 Java 语言之后,浏览器的功能被扩大了,Java 程序可以直接在浏览器里运行,可以直接与远程服务器交互:用 Java 语言编程,可以在互联网上像传送电子邮件一样方便地传送程序文件。

? ? 1995年,Sun 虽然推出了 Java,但这只是一种语言,如果想开发复杂的应用程序,必须要有一个强大的开发类库。

2.6. 1996年(JDK1.0)

? ? Sun 在1996年年初发布了 JDK1.0。这个版本包括两部分:运行环境(即 JRE)和开发环境(即JDK)。运行环境包括核心 API、集成 API、用户界面 API、发布技术、Java 虚拟机(JVM)5个部分;开发环境包括编译 Java 程序的编译器(即 javac 命令)。

? ? JDK1.0 版本的代表技术点有:Java虚拟机、Applet、AWT等。同年5月底,首届 JavaOne 大会在旧金山顺利举行,从此 JavaOne 成为了全世界数百万 Java 语言开发者一年一度的技术盛会。9月,已有大约8万网页应用采用了 Java 技术实现。

2.7. 1997年(JDK1.1)

? ? Sun 在1997年2月18日发布了 JDK1.1。JDK1.1 增加了 JIT(即时编译)编译器。JIT 和传统的编译器不同,传统的编译器是编译一条,运行完成后将其扔掉;而 JIT 会将经常用到的指令保存在内存中,当下调用时就不需要重新编译了,通过这种方式让 JDK 在效率上有了较大提升。

? ? Java 里许多最基础的技术点(如 JDBC 等)都是在 JDK1.1 版本中提出的,JDK1.1 版本的技术代表有:JAR 文件格式、JDBC、JavaBeans、RMI 等。Java 语言的语法也有了一定的增强,如内部类(Inner Class)和反射(Reflection 都是在这个版本出现的)。

JDK1.1 引入的新特性:
1. 内部类的概念
2. Java Bean的概念
3. JDBC
4. RMI
5. AWT事件模型被彻底重塑
6. 反射仅支持Introspection,在运行时无法修改。(通过引入AccessibleObject类及其子类,如Field类,在J2SE 1.2中添加了反射性修改对象的能力。)
7. Symantec公司为JavaSoft制作了Microsoft Windows平台上的 JIT(Just In Time)编译器
来自Taligent公司的国际化和Unicode支持

? ? 但一直以来,Java 主要的应用就是网页上的 Applet 以及一些移动设备。到了1996年年底,Flash 面世了,这是一种更加简单的动画设计软件:使用 Flash 几乎无须任何编程语言知识,就可以做出丰富多彩的动画。随后 Flash 增加了 ActionScript 编程脚本,Flash 逐渐蚕食了 Java,在网页上有了较大提升。

? ? 从1995年 Java 诞生到1998年年底,Java 语言虽然成为了互联网上广泛使用的编程语言,但它并没有找到一个准确的定位,也没有找到它必须存在的理由:Java 语言可以编写 Applet,而 Flash 一样可以做到,而且更快,开发成本更低。

2.8. 1998年(JDK1.2)

? ? 1998年12月,Sun 公司召开 JavaOne 大会,迎来了一个里程碑式的版本:工程代号为Playground的 JDK1.2,Sun 在这个版本中把 Java 技术体系拆分为三个方向,分别是面向桌面开发的 J2SE、面向企业开发的 J2EE、面向移动端开发的 J2ME。在这个版本中出现了非常多的代表性技术,如 EJB、Java Plug-in、Java IDL、Swing 等,并且这个版本中 Java 虚拟机第一次内置了 JIT(Just In Time)即时编译器(JDK1.2 中曾并存过三个虚拟机:Classic VM、HotSpot VM和 Exact VM, 其中 Exact VM 只在 Solaris 平台出现过;其余两款虚拟机都是内置了 JIT 即时编译器的,而之前版本所带的 Classic VM 只能以外挂的形式实用即时编译器)。在语言和 API 层面上,Java 添加了一系列 Collections 集合类等。

JDK1.2 新特性:
1. Java plug-in(Java applet)
2. Java IDL,一种用于CORBA互操作性的IDL实现
3. Collections集合框架
4. Swing图形API已集成到核心类中
5. Sun的JVM首次配备了JIT编译器
6. strictfp关键字

Sun 公司发布 Java 的三个版本:标准版(J2SE)、企业版(J2EE)和微型版(J2ME):
J2SE(标准版):整个 Java 技术的核心和基础,它是 J2ME、J2EE 编程的基础。
J2ME(微型版):主要用于控制移动设备和信息家电等有限存储的设备。
J2EE(企业版):Java 技术中应用最广泛的部分,J2EE 提供了企业应用开发相关的完整解决方案。这标志着 Java 已经吹响了向企业、桌面和移动三个领域进军的号角,标志着 Java 已经进入Java2 时代,这个时期也是 Java 飞速发展的时期。

在 Java2 中,Java 发生了很多革命性的变化,而这些革命性的变化一直沿用到现在,对于 Java 的发展形成了深远的影响。直到今天还经常看到 J2EE、J2ME 等名称。

不仅如此,JDK1.2 还把它的 API 分成了三类:
核心 API:由 Sun 公司制定的基本的 API,所有的 Java 平台都应该提供。这就是平常所说的 Java 核心类库。
可选 API:这是 Sun 为 JDK 提供的扩充 API,这些 API 因平台的不同而不同。
特殊 API:用于满足特殊要求的 API。如用于 JCA 和 JCE 等第三方加密类库。

2.9. 1999年(HotSpot)

1999年,HotSpot虚拟机诞生。

2.10. 2000年(JDK1.3)

? ? 2000年5月8日,JDK1.3 版本发布。从此 Sun 公司维持着稳定的研发节奏:大约每隔两年发布一个 JDK 的主版本,以动物命名,期间发布的各个修正版本则以昆虫作为工程代号。

JDK1.3 新特性:
1. 包括了HotSpot JVM(HotSpot JVM于1999年4月首次发布,用于J2SE 1.2 JVM)
2. 修改了RMI以支持与CORBA的可选兼容性
3. Java Naming and Directory Interface (JNDI) 包含在核心库中(以前作为扩展提供)
4. Java Platform Debugger Architecture (JPDA)
5. JavaSound API
6. Synthetic proxy classes

2.11. 2002年(JDK1.4)

? ? 2002年2月13日,JDK1.4 发布,该版本是标志着 Java 真正走向成熟的一个版本。带来了非常多技术新特性,如正则表达式、异常链、NIO、日志类、XML解析器、XSLT转换器等。JDK1.4 已经可以使用 Java 实现大多数的应用了。

JDK 1.4 开发代号为Merlin(隼)引入的新特性包括:
1. XML处理;
2. Java打印服务;
3. 引入Logging API;
4. 引入Java Web Start;
5. 引入JDBC 3.0 API;
6. 引入断言;
7. 引入Preferences API;
8. 引入链式异常处理;
9. 支持IPv6;
10. 支持正则表达式;
11. 引入Image I/O slot machine API。

在此期间,Java 语言在企业应用领域大放异彩,涌现出大量基于 Java 语言的开源框架如 Struts、WebWork、Hibernate、Spring等;大量企业应用服务器也开始涌现比如 WebLogic、WebSphere、JBoss等,这些都标志着 Java 语言进入了飞速发展时期。

2.12. 2004年(JDK5)

? ? 2004年9月30日,JDK5 发布, Sun 公司从这个版本开始将产品版本号格式修改成了“JDK x”,称为Java5.0,该版本在 Java 语法易用性上做了非常大的改进。如:自动装箱拆箱、泛型、动态注解、枚举、可变长参数、循环遍历(foreach)等语法特性。这个版本改进了 Java 的内存模型(Java Memory Model,JMM),提供了重要的 JUC 包(java.util.concurrent 并发编程包)。同时,也发布了新的企业级平台规范,如通过注释等新特性来简化 EJB 的复杂性,并推出了自己的 MVC 框架规范:JSF,JSF 规范类似于 ASP.NET 的服务器端控件,通过它可以快速地构建复杂的 JSP 界面。

JDK5 新特性:
1. 引入了泛型:避免了手动类型转换,使用类型擦除实现,在编译时删除泛型信息并使用Object替换,在实际使用时强转会原始类型
2. 引入了注解,也叫原数据(metadata),允许在类或方法等数据结构上做附加数据标记
3. 原始类型的自动拆装箱
4. 引入了枚举
5. 可变长参数,允许方法的最后一个参数是可变长度
6. for each 循环,用于迭代数组或Iterable集合
7. 改进了Java多线程语义,增加了JUC(java.util.concurrent)包,增加了多个多线程工具,新的Java内存模型解决了先前规范的复杂性、有效性和性能问题
8. 增加了静态import语法(import static)
9. 自动为RMI(远程方法调用)对象生成方法stub
10. Swing:新的look and fell,称为 synth
11. 用于解析来自各种输入流和缓冲区的数据的扫描器类(Scanner class)
12. 版本命名变更,1.5.0 表示开发者内部版本,JDK5 表示产品版本

2.13. 2005年

? ? 2005年6月,JavaOne 大会召开,Sun 公司公开 Java SE6。此时,Java 的各种版本已经更名以取消其中的数字“2”:J2EE 更名为 Java EE, J2SE 更名为 Java SE,J2ME 更名为 Java ME。一直以来,Sun 公司维持着大约 2 年发布一次 JDK 新版本的习惯。

2.14. 2006年(JDK6)

? ? 2006年12月11日,JDK6 发布,在这个版本中,Sun 公司终结了 J2EE、J2SE、J2ME 的产品线命名方式,启用 JavaEE、JavaSE、JavaME 的新命名格式来代替。JDK6 应该是 Java 史上使用寿命最长的一个版本,主要原因是中间经历了代码复杂性增加、世界经济危机、Oracle 对 Sun进行收购。同年的 JavaOne 大会上,Sun 公司宣布计划要把 Java 源代码开源,随后陆续的将JDK 的各个部分在 GPLv2(GNU General Public Lcensev2)协议下公开了源码,并建立了OpenJDK 组织对这些源代码进行独立管理。

JDK6 新特性:
1. 脚本语言支持:用于与脚本语言紧密集成的通用API,以及内置的 Mozilla JavaScript Rhino 集成。
2. Swing 的显着性能改进
3. 通过JAX-WS改进了Web服务支持
4. JDBC 4.0
5. Java Compiler API:一种允许Java程序以编程方式选择和调用Java编译器的API
6. JAXB升级到2.0版:包括集成 StAX 解析器
7. 支持可插入注解(在编译期对代码中的注解进行处理,从而影响前端编译器的工作过程,常见时间是lombok)
8. 许多GUI接口的改进
9. JVM 改进包括:同步和编译器性能优化、新算法和对现有垃圾收集算法的升级以及应用程序启动性能

2.15. 2009年

2009年4月,Oracle 宣布将以74亿美元收购了市值曾超过2000亿美元的 Sun 公司,同时获取了 Java 的版权。一年后詹姆斯高斯林宣布离职。

2.16. 2011年(JDK7)

? ? 2011年7月,JDK7 的第一个里程碑版本发布。按 JDK7 最初的功能规划,一共会设置十个里程碑。从 JDK7 最原始的功能清单来看,它本应是一个包含许多重要改进的 JDK 版本,但现实不如人愿,由于 Sun 公司在商业上遇到了问题,没有精力去推动 JDK7 的研发工资,因此以下功能没能全在 JDK7 中完成实现:
- Lambda项目:支持Lambda表达式,支持函数式编程。(JDK 8)?
- Jigsaw项目:虚拟机层面的模块化支持。(JDK 9)?
- 动态语言支持:Java是静态语言,为其他运行在Java虛拟机上的动态语言提供支持。?
- Garbage-First收集器。(JDK 8)?
- Coin项目:Java语法细节进化。(部分JDK 8)

? ? 从 JDK7 Update4 开始, JavaSE 的核心功能正式开始为 MacOS X 操作系统提供支持,并在JDK7 Update6 中达到所有功能与 MacOS X 完全兼容的程度;同时,JDK7 Update6 还对 ARM 指令集架构提供了支持。至此,Sun 官方提供的 JDK 可以运行于 Windows(不含Windows 9x)、Linux、Solaris 和 MacOS X 操作系统上,支持 ARM、x86\x86-64 和 SPARC指令集架构,JDK7 也是可以支持 Windows XP 操作系统的最后一个版本。

JDK7 开发代号是 Dolphin(海豚)引入的新特性包括:
1. 动态语言支持,使用新的invokedynamic字节码,遵循当前在多语言虚拟机上完成的原型设计工作
2. 压缩的 64 位指针(在Java 6中可用 -XX:+UseCompressedOops开启)
3. Coin项目
4. switch语句中使用String
5. 自动管理资源的try-with-resources
6. 改进了实例创建时的类型推断菱形运算符<>
7. 简化了可变参语法
8. 二进制的数字表示 byte aByte = (byte)0b00100001;
9. 允许在数字中使用下划线
10. 使用改进的类型检查捕获多种异常类型并重新抛出异常
11. JDBC4.1
12. jcmd工具,用来代替jps
13. fork/join框架
14. 并发实用工具
15. 新的文件I/O库增加了对多个文件系统、文件元数据和符号链接的支持。新包是java.nio.file、java.nio.file.attribute 和 java.nio.file.spi
16. Java Mission Control
17. 使用Timsort替代集合和数组中的归并排序
18. 对椭圆曲线密码学的库级支持
19. 用于Java 2D的XRender管道,可改进对现代GPU特定功能的处理
20. 实现6u10中不受支持的图形API
21. 增强了对新网络协议的库级支持,包括SCTP和Sockets Direct Protocol
22. XML和Unicode的上游更新
23. Java deployment rule sets

2.17. 2014年(JDK8)

? ? 2014年3月18日,JDK8发布,提供了 Lambda 表达式支持、内置 Nashorn JavaScript 引擎支持、新的时间日期 API、彻底移除 HotSpot 永久代。
- Lambda表达式
- Stream 操作
- HashMap 改进
- Nashorn 项目

允许开发人员在应用程序中嵌入 JavaScript 代码:
- 重复注解?
- 类型注解?
- 无符号整型?
- 新的日期和时间API?
- 静态链接的JNI库?
- 启动 JavaFX 应用程序(直接启动 JavaFX 应用程序 JAR)?
- 删除永久代

JDK8 开发代号是Spider(蜘蛛),引入新特性如下:
1. 支持 lambda支持;
2. 增强日期与时间API的功能;
3. 对垃圾回收的性能也进行了改进,并且移除了permgen区;
4. Lambdas表达式与Functional接口;
5. 接口的默认与静态方法;
6. 方法引用;
7. 重复注解;
8. 更好的类型推测机制;
9. 扩展注解的支持。

2.18. 2017年(JDK9)

2017年9月,Oracle 公司发布了 Java SE 9,这次版本升级强化了 Java 的 Jigsaw 虚拟机模块化系统,让庞大的 Java 语言更轻量化,而且采用了更高效、更智能的 G1 垃圾回收器,并在核心类库上进行了大量更新,可以进一步简化编程,但对语法本身更新并不多。从此每六个 JDK 大版本划出一个三年支持的 LTS 版本(Long Term Support),普通版本只有六个月生命周期。JDK8 和JDK11 是 LTS 版本。下一个就是要在 2021 年发布的 JDK17 了。

JDK9 新特性:
1. Jigsaw项目下JDK的模块化(Java 平台模块系统)
2. G1成为了默认的垃圾回收器
3. 统一了 JVM/GC 日志
4. HTTP/2 Client
5. 更方便的集合工厂方法,以前大多使用Guava类库
6. docker方便的支持
7. 货币API
8. 实现了响应式流
9. 新的Flow类
10. 并发工具的更新
11. 更加紧凑的字符串
12. HiDPI graphics:自动缩放和调整大小
13. 变量句柄(Variable handles):用来代替java.util.concurrent.atomic和sun.misc.Unsafe操作的等价物
14. Coin语法改进项目继续进行
15. jshell:Java Shell:JShell 是Java语言的REPL(读取-执行-打印循环)命令行界面
16. XML目录
17. jlink:Java 链接器:创建一个工具,可以将一组模块及其依赖项组装和优化为自定义运行时映像。它有效地允许生成一个完全可用的可执行文件,包括运行它的 JVM。
18. 提前编译:GraalVM 提供的提前编译。

2.19. 2018年(JDK10、JDK11)

? ? 2018年3月20日,JDK10 发布,该版本主要是内部重构。JDK10 中引入了两个主要的增强功能:JEP 319根证书----列表或根证书已公开给 JDK 的 cacerts 密钥库;一些与安全相关的 API 标记为要删除。同年,Oracle 公司宣告 JavaEE 成为历史名词。同年,JavaOne 大会成为最后一届。

JDK10 新特性:
1. 局部变量类型推断 var 关键字 
2. GC接口:通过引入干净的垃圾收集器 (GC) 接口来改进不同垃圾收集器的源代码隔离 
3. G1并行full GC - CDS:为了改善启动和占用空间,扩展现有的类数据共享 (“CDS”) 功能以允许将应用程序类放置在共享存档中 
4. 线程的本地握手:一种无需执行全局VM安全点即可在线程上执行回调的方法。使停止单个线程而不只是所有线程或不停止所有线程成为可能且成本低廉 
5. 移除了javah工具,被JDK 8中添加的javac高级功能取代 
6. 额外的 Unicode 语言标签扩展 
7. 替代内存设备上的堆分配:启用HotSpot VM以在用户指定的备用内存设备(例如 NV-DIMM)上分配Java对象堆 
8. 实验性基于 Java 的 JIT 编译器 
9. 基于时间的发布版本控制:针对当前和未来基于时间的发布模型,修订 Java SE 平台和 JDK 的版本字符串方案以及相关版本控制信息

? ? 2018年9月25日,LTS 版本的 JDK11 发布,ZGC 出现。同时 Oracle 公司调整了 JDK 授权许可证。OpenJDK 免费版只有半年支持。OracleJDK 在生产环境必须付费,但有三年支持。迫使商业用户要么不断升级 JDK 版本,要么去购买商业支持。JDK11 中引入的主要安全增强功能由 JEP 332:传输层安全性(TLS)1.3提供。这是 TLS 协议的新版本,与 TLS 规范的先前版本(1.2)相比,提供了许多增强功能。此外,对 cacerts 密钥库中的根证书进行了更多增强(添加了一些根证书,并删除了一些根证书)。之后Oracle公司便以每年发布两个版本的速度升级迭代。

JDK11 新特性:
1. 嵌套访问控制,在java 11之前嵌套类的访问,是编译器通过生成匿名的public桥接方法实现嵌套类之间的访问私有成员控制,这种在使用反射时无法生成桥接方法而导致不能直接访问嵌套类私有成员。java 11中通过虚拟机指令级别的支持,运行嵌套类之间直接访问私有成员。Class类新增了getNestHost,getNestMembers方法 
2. 增加了一个新的常量池类型:CONSTANT_Dynamic,解决java 7中引入的invokeddynamic协议中俩个复杂的常量池及引导时的校验这种麻烦的场景,改善程序性能和简化编译器逻辑 
3. 引入了一个消极的垃圾回收器Epsilon,分配有限的资源,不进行垃圾回收操作,可用于性能测试和短生命周期任务 
4. 移除了Java EE 和 CORBA 模块 
5. Java 11 对 Java 9 中引入并在 Java 10 中进行了更新的 Http Client API 进行了标准化,在前两个版本中进行孵化的同时,Http Client 几乎被完全重写,并且现在完全支持异步非阻塞 
6. var关键字可以在Lambda表达式中使用 
7. 引入了新的秘钥协议方案 Curve25519 和 Curve448 
8. 支持Unicode 10 
9. 开源了之前是商业版的飞行记录仪 
10. 实现 RFC 7539的ChaCha20 and ChaCha20-Poly1305加密算法 
11. 可以直接运行单个源码文件,而无需编译。简化了小程序的运行流程 
12. 通过JVMTI的SampledObjectAlloc回调提供了一个开销低的heap分析方式 
13. 支持TLS 1.3 
14. 提供了实验性的ZGC垃圾收集器 
15. 废除Nashorn javascript引擎,在后续版本准备移除掉,有需要的可以考虑使用GraalVM 
16. 废除了pack200以及unpack200工具以及java.util.jar中的Pack200 API。Pack200主要是用来压缩jar包的工具,不过由于网络下载速度的提升以及java9引入模块化系统之后不再依赖Pack200,因此这个版本将其移除掉

接下来的 JDK12、JDK13、JDK14、JDK15、JDK16、JDK18、JDK19 都是过渡产品,不太受开发者待见。?

2.20. 2019年(JDK12、JDK13)

? ? 2019年2月,JDK12 发布,引入了 Shenandoah 垃圾收集器,作为首个非 Oracle 公司开发的垃圾收集器,由于目标与 Oracle 在 JDK11 引入的 ZGC 几乎一致,存在竞争关系。OracleJDK 12 把相关代码通过条件编译强行踢出,使其无法在 OracleJDK 中使用。

JDK12 新特性:
1. 提供了实验性的Shenandoah垃圾收集器
2. 在 JDK 源代码中添加一套基本的微基准测试,让开发人员可以轻松地运行现有微基准测试并创建新的微基准测试
3. 扩展了switch语句,使之可以合并多个分支,或用于返回语句。处于试验阶段
4. 引入 API 来对关键类文件和运行时工件的名义描述建模,特别是可从常量池加载的常量
5. 之前JDK有两个关于aarch64的实现,现在只保留一个
6. 在 64 位平台上编译JDK时生成一份默认的 CDS 存档文件方便大家使用
7. JDK 12之前G1进行回收时一旦确定了CSet,就不会停止。这是STW的时间可能会超出预期停顿时间。JDK 12使用混合回收,当选择了一个比较大的CSet时将其分为强制部分和可选部分,当回收完强制部分还有剩余时间时。才回收可选部分。随着预测进行,可选部分会越来越小。如果预测变得不准确,集合将会再次分为两部分
8. 增强 G1 垃圾收集器在空闲时自动将 Java 堆内存返还给操作系统。G1目前只有在full GC或者concurrent cycle的时候才会归还内存,由于这两个场景都是G1极力避免发生的。这时在付费的容器环境中极为不利。G1 将在应用程序不活动期间,定期尝试继续或触发并发循环,以确定总体 Java 堆使用情况。这将导致它自动将 Java 堆中未使用的部分返回给操作系统。或者,在用户控制下,可以执行full GC 以最大化返回的内存量

? ? 2019年9月,JDK13 发布,动态 CDS 归档;ZGC:取消提交未使用存储器;重新实现旧版Socket API;Switch表达式(预览阶段)。

1. 之前需要用户手动的创建CDS,然后使用CDS运行应用。JDK 13中可以在应用第一次运行期间自动生成CDS 存档 
2. 增强 ZGC 将未使用的堆内存返回给操作系统 
3. 重新实现了传统的Socket API。将java.net.Socket和java.net.ServerSocketAPI使用的底层实现替换为更简单、更现代、易于维护和调试的实现 
4. 增强的switch表达式,第二次预览阶段 
5. 引入了文本块语法,预览阶段

2.21. 2020年(JDK14、JDK15)

2020年3月,JDK14 发布,主要包含16个功能改进和漏洞修复。

JDK14 新特性:
1. 增强了instanceof功能,简化了使用。预览阶段 
2. 增加了一个java的应用打包工具,可以打包成各平台的应用格式。孵化阶段 
3. 实现了G1垃圾收集器的NUMA-aware内存分配,以提升在大型机器上的性能 
4. JDK11引入了JFR,使用的时候先dump到磁盘上然后再分析;而在JDK14则支持stream方式来订阅JFR事件进行持续性的监控 
5. 支持MappedByteBuffer访问non-volatile memory (NVM) 
6. 增加了空指针异常的提示信息,便于定位空指针位置及原因,需要通过-XX:+ShowCodeDetailsInExceptionMessages开启 
7. 引入了新的数据载体类型 record,简化了用于存储数据的类代码,通过编译器实现,编译后的代码其实是继承了java.lang.Record 
8. 增强的switch表达式不再是预览阶段了,进入了正式版本 
9. 弃用 Solaris/SPARC、Solaris/x64 和 Linux/SPARC 端口,在未来的发行版中删除它们 
10. 移除了并发标记清除 (CMS) 垃圾收集器 
11. ZGC支持了macOS系统 
12. ZGC支持了Windows系统 
13. 弃用 Parallel Scavenge 和 Serial Old 垃圾收集算法的组合 
14. 删除pack200和unpack200工具,以及Pack200在APIjava.util.jar包。这些工具和 API在 Java SE 11中已被弃用 
15. 文本块语法进入二次预览阶段 
16. 引入 API 以允许 Java 程序安全有效地访问 Java 堆之外的外部内存。孵化阶段

2020年9月,JDK15 发布,主要是安全更新和 bug 修复。

JDK15 新特性:
1. 使用爱德华兹曲线数字签名算法 (EdDSA) 实现加密签名 
2. 引入了两个关键字sealed和permits。实现了密封类继承语法。处于预览阶段。在过去的java语法中,类可以被自由的继承。在新的语法中,可以用sealed密封一个类,然后使用permits限制可以继承这个类的子类 
3. JDK15引入了隐藏类,同时废弃了非标准的sun.misc.Unsafe::defineAnonymousClass使用Lookup::defineHiddenClass,目标是为框架提供在运行时生成内部的class 
4. 删除 Nashorn JavaScript 脚本引擎和 API 以及该jjs 工具。引擎、API 和工具在 Java 11中已被弃用 
5. 该特性使用更简单及更现代的方式重新实现了java.net.DatagramSocket及java.net.MulticastSocket以方便更好的维护及debug,新的实现将会更容易支持虚拟线程 
6. 禁用和弃用了偏向锁。随着JUC包的引入,Synchronized关键字的使用场景减少,偏向锁的收益不再明显。偏向锁定在同步子系统中引入了大量复杂的代码,并且对其他 HotSpot 组件也有侵入性。这种复杂性是理解代码各个部分的障碍,也是在同步子系统内进行重大设计更改的障碍。为此,我们希望禁用、弃用并最终删除对偏向锁定的支持 
7. 增强的instanceof进入二次预览阶段 
8. ZGC现可被引入生产环境 
9. 文本块语法结束了预览阶段,进入了正式版本 
10. Shenandoah现可用于生产环境 
11. Solaris and SPARC 移植内容在JDK14被标记为废弃,在JDK15版本正式移除 
12. 外部内存访问API进入二次孵化阶段 
13. record类型进入二次预览阶段 
14. JDK15废弃了RMI Activation,后续将被移除

2.22. 2021年(JDK16、JDK17)

2021年3月,JDK16 发布,主要包含17个更新。

JDK16 新特性:
1. 提供了一套新的向量计算API,并且向量计算运行时可以尽量编译到硬件支持的最佳指令上 
2. 允许在 JDK C++ 源代码中使用 C++14 语言特性,并给出关于哪些特性可以在 HotSpot 代码中使用的具体指导 
3. 将 OpenJDK 社区的源代码存储库从 Mercurial (hg) 迁移到 Git 
4. 在GitHub上托管OpenJDK 社区的 Git 存储库。与JEP 357(从 Mercurial 迁移到 Git)一致,这会将所有单存储库 OpenJDK 项目迁移到 GitHub,包括版本 11 及更高版本的JDK 功能版本和JDK 更新版本 
5. 将 ZGC 线程堆栈处理从安全点移动到并发阶段 
6. 将 Unix 域 ( AF_UNIX) 套接字支持添加到包中的套接字通道和服务器套接字通道API java.nio.channels。扩展继承的通道机制以支持 Unix 域套接字通道和服务器套接字通道 
7. 将 JDK 移植到 Alpine Linux 
8. 更及时地将未使用的 HotSpot 类元数据(即元空间)内存返还给操作系统,减少元空间占用空间,并简化元空间代码以降低维护成本 
9. 将 JDK 移植到 Windows/AArch64 
10. 从 Java 1.1 开始,Java 就支持通过Java 本地接口 (JNI)调用本地方法,但这条路径一直是艰难而脆弱的。外部链接器 API(孵化阶段)提供对本机代码的静态类型、纯 Java 访问。此 API 与外部内存 API ( JEP 393 ) 一起,将大大简化绑定到本机库的其他容易出错的过程 
11. 当对原始值类型及其包装类型使用synchronize时发出警告 
12. 提供jpackage用于打包自包含 Java 应用程序的工具。该jpackage工具是由JEP 343在 JDK 14 中作为孵化工具引入的 
13. 外部内存访问API进入三次孵化阶段 
14. 增强的instanceof进入了正式版本 
15. record类型进入了正式版本 
16. 默认情况下,强封装 JDK 的所有内部元素,除了关键的内部 API,如sun.misc.Unsafe. 允许最终用户选择自 JDK 9 以来一直默认的宽松强封装 
17. sealed进入第二次预览阶段

2021年9月,LTS 版本的 JDK17 发布,主要包含14个更新。这个是继 Java 11 之后的又一个长期支持版本,并且直接支持到了2029年9月。这可能是下一个 Java 8,所以学习的话,可以直接学习这个版本。当然也可以直接学习 Java 17 ,这样的话,对于工作来说3年之内不会有大的变化。

JDK17 新特性:
1. 浮点运算始终严格,而不是同时具有严格的浮点语义 ( strictfp) 和略有不同的默认浮点语义。这将恢复语言和 VM 的原始浮点语义,匹配 Java SE 1.2 中引入严格和默认浮点模式之前的语义 
2. 增强型伪随机数生成器 
3. 使用 Apple Metal API 为 macOS 实现 Java 2D 内部渲染管道,作为现有管道的替代方案,现有管道使用已弃用的 Apple OpenGL API 
4. 将 JDK 移植到 macOS/AArch64 
5. 弃用 Applet API 以进行删除。它基本上无关紧要,因为所有 Web 浏览器供应商都已取消对 Java 浏览器插件的支持或宣布了这样做的计划 
6. 强烈封装 JDK 的所有内部元素,除了关键的内部 API,如sun.misc.Unsafe. 不再可能通过单个命令行选项来放松内部元素的强封装,就像在 JDK 9 到 JDK 16 中那样 
7. 将switch表达式与增强的instanceof进行结合,可以一起使用 删除远程方法调用 (RMI) 激活机制,同时保留 RMI 的其余部分 
8. sealed进入正式版本 
9. 删除实验性的基于 Java 的提前 (AOT) 和即时 (JIT) 编译器。该编译器自推出以来几乎没有什么用处,维护它所需的工作量很大。保留实验性的 Java 级 JVM 编译器接口 (JVMCI),以便开发人员可以继续使用外部构建的编译器版本进行 JIT 编译 
10. 提供外部函数和内存 API(孵化阶段),Java 程序可以通过该 API 与 Java 运行时之外的代码和数据进行互操作。通过有效调用外部函数(即 JVM 之外的代码),以及安全地访问外部内存(即不由 JVM 管理的内存),API 使 Java 程序能够调用本地库和处理本地数据,而不需要通过JNI 
11. 向量计算API进入二次孵化阶段 
12. 特定于上下文的反序列化过滤器

2.23. 2022年(JDK18、JDK19)

2022年3月22日,JDK18 发布。

JDK18 新特性:
1. 将UTF-8指定为标准Java API的默认字符集 
2. 简单Web服务器 
3. Java API文档中支持Snippets代码片段 
4. 重新实现反射核心机制(Method Handles) 
5. 矢量API(三次孵化中) 
6. 定义全新的互联网地址解析SPI 
7. 外部函数和内存API(二次孵化中) 
8. Switch模式匹配(二次预览中) 
9. 弃用Finalization

2022年9月20日,JDK19 发布。

1. 记录模式(一次预览中) 
2. Switch模式匹配(三次预览中) 
3. 外部函数和内存API(一次预览中) 
4. 矢量API(四次孵化中) 
5. Linux/RISC-V端口 
6. 虚拟线程(一次预览中) 
7. 结构化并发(一次孵化中)

2.24. 2023年(JDK20、JDK21)

2023年3月21日,甲骨文公司发布了最新版 JDK20。JDK 20 是一个仅支持六个月的短期版本,它是2022年9月20日发布的 JDK 19 的迭代产品。

JDK20 新特性:
1. 矢量API
2. 虚拟线程(第二次优化)
3. 结构化并发
4. Scoped values 作用域值
5. 记录模式(第二次优化)
6. 外部函数和内存API
7. Switch语句和表达式的模式匹配

2023年9月19日,Oracle 公司正式发布了 JDK 21,这是按照六个月发布周期准时交付的第12个功能版本。根据发布的规划,这次发布的 JDK 21 将是一个长期支持版(LTS 版)。LTS 版每 2 年发布一个,上一次长期支持版是 21 年 9 月发布的 JDK 17。

JDK21 新特性:
1. 字符串模板(预览阶段)
2. 序列集合
3. 加入 Generational ZGC
4. 记录模式
5. switch 模式匹配
6. 外部函数与内存 API(第三次预览)
7. 未命名模式和变量(预览版)
8. 虚拟线程
9. 未命名类和实例主要方法(处于预览阶段)
10. 作用域值(处于预览阶段)
11. 矢量 API(第六个孵化器)
12. 弃用 Windows 32 位 x86 端口
13. 禁止代理的动态加载
14. 密钥封装机制的 API
15. 结构化并发(目前处于预览阶段)

三. 总结

? ? 通过对 Java 语言发展历程的了解,我们不仅能够更好地理解其起源和演变过程,还能够从中汲取到许多宝贵的经验和教训。学习一门新的编程语言不仅仅是掌握语法和特性,更重要的是要了解其背后的设计理念和应用场景。因此,在开始学习 Java 之前,深入了解其发展史是非常有益的。

? ? 在学习 Java 的过程中,我们可以借鉴 Java 的发展经验,注重实践和项目经验的积累,不断提升自己的编程能力和解决问题的能力。同时,我们也要关注 Java 的最新动态和技术趋势,不断学习和适应新的技术和框架,以保持自己的竞争力。

? ? 如今在全世界的各行各业的信息设施中几乎都有 Java 的身影,有大量的 Java 需求需要人员去开发,但还是有人会抱怨找不到工作,其实我认为是因为学艺不精!我相信合格和经验丰富的 Java 开发人员是不会缺少工作机会的,尤其是当前出现的 AI、云计算、大数据、物联网、区块链、chatgpt 等新兴技术都或多或少会依赖 Java 技术的,因此 Java 就业方向只会多不会少!

文章来源:https://blog.csdn.net/mrluo735/article/details/134846840
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。