计算工具的演化经历了由简单到复杂、从低级到高级的不同阶段,例如从“结绳记事”中的绳结到算筹、算盘、计算尺、机械计算机等。
1889年,美国科学家赫尔曼·何乐礼研制出以电力为基础的电动制表机,用以储存计算资料。
1930年,美国科学家范内瓦·布什造出世界上首台模拟电子计算机。
1946年2月14日,由美国军方定制的世界上第一台电子计算机“电子数字积分计算机”(ENIAC Electronic Numerical And Calculator)在美国宾夕法尼亚大学问世了。ENIAC(中文名:埃尼阿克)是美国奥伯丁武器试验场为了满足计算弹道需要而研制成的,这台计算器使用了17840支电子管,大小为80英尺×8英尺,重达28t(吨),功耗为170kW,其运算速度为每秒5000次的加法运算,造价约为487000美元。ENIAC的问世具有划时代的意义,表明电子计算机时代的到来。
1946年2月14日世界上首台电子计算机问世,第一代计算机语言“机器语言”便诞生了,它使用的是最原始的穿孔卡片,这种卡片上打孔符号本质上是计算机能识别的唯一语言。为了能让人们更容易理解并编写,于是便有了第二代的“汇编语言”,开始用字母来代替。简单的“0、1”数码谁也不会理解,但字母是人们能够阅读并拼写的。当计算机语言发展到第三代时,第三代语言被人们称之为“高级语言”。高级语言是接近于人们使用习惯的程序设计语言,Java便是其中一种。
1990年年末,Sun公司预料嵌入式系统将在未来家用电器领域大显身手。于是Sun公司成立了一个由James Gosling(詹姆斯·高斯林)领导的“Green计划 ”,准备为下一代智能家电(电视机、微波炉、电话)编写一个通用控制系统。团队最初考虑使用C++语言,但是很多成员包括Sun的首席科学家Bill Joy,发现C++和可用的API在某些方面存在很大的问题。很多成员都发现C++太复杂,以致很多开发者经常错误使用。而且C++缺少垃圾回收系统、可移植性、分布式和多线程等功能。Bill Joy 决定开发一种新语言,他提议在C++的基础上,开发一种面向对象的环境。于是,Gosling试图通过修改和扩展C++的功能来满足这个要求,但是后来他放弃了。他决定创造一种全新的语言:Oak(橡树,java的前身)。
到了1992年的夏天,Green计划已经完成了新平台的部分功能,包括Green操作系统。Oak的程序设计语言、类库等。关于智能家电的商业计划没有成功。此时,可怜的Green项目几乎接近夭折,甚至Green项目的一半成员也被调到了其他的项目组。
1994年夏天,互联网和浏览器的出现不仅给广大互联网的用户带来了福音,也给Oak语言带来了新的生机。Gosling立即意识到,这是一个机会,于是对Oak进行了小规模的改造。到了1994年秋,小组中的Naughton(诺顿)和Jonathan Payne(乔纳森·佩恩)完成了第一个Java语言的网页浏览器:WebRunner. Sun公司实验室主任Bert Sutherland(伯特·萨瑟兰)和技术总监Eric Schmict(埃里克·施密特)观看了该浏览器的演示,对该浏览器的效果给予了高度评价。当时的Oak这个商品已经被注册,于是只得将Oak更名为Java。
Sun公司在1995年年初发布了Java语言,Sun公司直接把Java放到互联网上,免费给大家使用,甚至连源代码也不保密,也放到互联网上向所有人公开。几个月后,Java成了互联网上最热门的宝贝。竟然有10万多人次访问了Sun公司的网页,下载了Java语言。然后,互联网上立即就有了数不清的Java小程序(也就Applet),演示着各种小动画、小游戏等。Java 语言终于眼眉吐气了 ,成为了一种广为人知的编程语言。在Java语言出现之前,互联网的网页实质上就像一张纸,不会有动态的内容。有了Java语言之后,浏览器的功能被扩大了,Java程序可以直接在浏览器里运行!

- 版本 发布日期
- JDK 22 2024年4月16日
- JDK 21 2023年9月19日
- JDK 20 2023年4月18日
- JDK 19 2022年10月18日
- JDK 18 2022年4月19日
- JDK 17 2021年9月14日
- JDK 16 2021年3月16日
- JDK 15 2020年9月15日
- JDK 14 2020年3月17日
- JDK 13 2019年9月17日
- JDK 12 2019年3月19日
- JDK 11 2018年9月25日
- JDK 10 2018年3月20日
- JDK 9 2017年9月21日
- JDK 8 2014年3月18日
- JDK 7 2011年7月28日
- JDK 6 2006年12月11日
- JDK 5.0 2004年9月30日
- JDK 1.4 2002年2月6日
- JDK 1.3 2000年5月8日
- JDK 1.2 1998年12月8日
- JDK 1.1 1997年2月19日
- JDK 1.0 1996年1月23日
Sun虽然推出了Java,但这只是一种语言,如果想开发复杂的应用程序,必须要有一个强大的开发类库。因此,Sun在1996年年初发布了JDK1.0。这个版本包括两部分:运行环境(即JRE)和开发环境(即JDK)。运行环境包括核心API、集成API、用户界面API、发布技术、Java虚拟机(JVM)5个部分;开发环境包括编译Java程序的编译器(即Javac命令)。
接着,Sun在1997年2月18日发布了JDK1.1。JDK1.1增加了JIT(即时编译)编译器。JIT和传统的编译器不同,传统的编译器是编译一条,运行完成后将其扔掉;而JIT会将经常用到的指令保存在内存中,当下调用时就不需要重新编译了,通过这种方式让JDK在效率上有了较大提升。
JDK 1.1 引入的新特性包括:
引入JDBC(Java Database Connectivity);
支持内部类;
引入Java Bean;
引入RMI(Remote Method Invocation);
引入反射(仅用于内省)。
但一直以来,Java主要的应用就是网页上的Applet以及一些移动设备。到了1996年底,Flash面世了,这是一种更加简单的动画设计软件:使用Flash几乎无须任何编程语言知识,就可以做出丰富多彩的动画。随后Flash增加了ActionScript编程脚本,Flash逐渐蚕食了Java在网页上的市场。
从1995年Java诞生到1998年年底,Java语言虽然成为了互联网上广泛使用的编程语言,但它并没有找到一个准确的定位,也没有找到它必须存在的理由:Java语言可以编写Applet,而Flash一样可以做到,而且更快,开发成本更低。
直到1998年12月,Sun公司召开JavaOne大会,发布了Java历史上最重要的JDK版本:JDK1.2。伴随着JDK1.2一同发布的还有JSP/Servlet、EJB等规范,并将Java分成J2EE、J2SE和J2ME三个版本。
1999年6月,SUN公司发布Java的三个版本:标准版(J2SE)、企业版(J2EE)和微型版(J2ME)。
J2ME(标准版):主要用于控制移动设备和信息家电等有限存储的设备。
J2SE(企业版):整个Java技术的核心和基础,它是J2ME、J2EE编程的基础,
J2EE(微型版):Java技术中应用最广泛的部分,J2EE提供了企业应用开发相关的完整解决方案。这标志着Java已经吹响了向企业、桌面和移动三个领域进军的号角,标志着Java已经进入Java2时代,这个时期也是Java飞速发展的时期。
不仅如此,JDK1.2还把它的API分成了三类。
- 核心API:由Sun公司制定的基本的API,所有的Java平台都应该提供。这就是平常所说的Java核心类库。
- 可选API:这是Sun为JDK提供的扩充API,这些API因平台的不同而不同。
- 特殊API:用于满足特殊要求的API。如用于JCA和JCE等第三方加密类库。
2001年9月24日,J2EE1.3发布
JDK 1.3 开发代号为Kestrel(红隼)引入的新特性包括:
引入Java Sound API;
jar文件索引;
对Java的各个方面都做了大量优化和增强。
2002年2月,Sun发布了JDK历史上最成熟的版本:JDK1.4成为发展最快的一个JDK版本。JDK1.4已经可以使用Java实现大多数的应用了。
JDK 1.4 开发代号为Merlin(隼)引入的新特性包括:
XML处理;
Java打印服务;
引入Logging API;
引入Java Web Start;
引入JDBC 3.0 API;
引入断言;
引入Preferences API;
引入链式异常处理;
支持IPv6;
支持正则表达式;
引入Image I/O slot machine API。
在此期间,Java语言在企业应用领域大放异彩,涌现出大量基于Java语言的开源框架如Struts、WebWork、Hibernate、Spring等;大量企业应用服务器也开始涌现比如WebLogic、WebSphere、JBoss等,这些都标志着Java语言进入了飞速发展时期。
2004年10月,Sun发布了万众期待的JDK1.5,同时,Sun将JDK1.5改名为Java SE5.0,J2EE、J2ME也相应地改名为Java EE和Java ME。
JDK1.5增加了诸如泛型、增强的for语句、可变数量的形参、注释、自动拆箱和装箱等功能;同时,也发布了新的企业级平台规范,如通过注释等新特性来简化EJB的复杂性,并推出了自己的MVC框架规范:JSF,JSF规范类似于http://ASP.NET的服务器端控件,通过它可以快速地构建复杂的JSP界面。
JDK 1.5 开发代号为Tiger(老虎)引入的新特性包括:
引入泛型;
增强循环,可以使用迭代方式;
自动装箱与自动拆箱;
类型安全的枚举;
可变参数;
静态引入;
元数据(注解);
引入Instrumentation。
SUN发布Java1.5版,成为Java平台发展史上又一里程碑。为了表明该版本的重要性,SUN将之称为Java5.0。
2005年6月,JavaOne大会召开,SUN公司公开Java SE 6。此时,Java的各种版本已经更名以取消其中的数字“2”:J2EE更名为Java EE, J2SE更名为Java SE,J2ME更名为Java ME。一直以来,Sun公司维持着大约2年发布一次JDK新版本的习惯。
2006年11月,SUN公司宣布Java全线采纳GNU (General Public License Version) 2,从而公开了Java的源代码。

JDK 1.6 开发代号为Mustang(野马)引入的新特性包括:
支持脚本语言;
引入JDBC 4.0 API;
引入Java Compiler API;
可插拔注解;
增加对Native PKI(Public Key Infrastructure)、Java GSS(Generic Security Service)、Kerberos和LDAP(Lightweight Directory Access Protocol)的支持;
继承Web Services;
做了很多优化。
2009年4月,Oracle宣布将以74亿美元收购Sun公司,同时获取了Java的版权。
2011年7月,Oracle公司终于”如约” 发布了 Java SE 7——这次版本的升级经过了将近5年时间。Java SE 7也是Oracle发布的第一个Java版本,引入了二进制整数、支持字符串的switch语句、棱形语法、多异常捕抓、自动关闭资源的try语言等新特性。
JDK 1.7 开发代号是Dolphin(海豚)引入的新特性包括:
switch语句块中允许以字符串作为分支条件;
在创建泛型对象时应用类型推断;
在一个语句块中捕获多种异常;
支持动态语言;
支持try-with-resources;
引入Java NIO.2开发包;
数值类型可以用2进制字符串表示,并且可以在字符串表示中添加下划线;
钻石型语法;
null值的自动处理。
2014年3月,Oracle公司发不了Java SE8,这次版本升级为Java带来了全新的Lambda表达式、流式编程等大量新特性,这些新特性使得Java变得更加强大。
JDK 1.8 开发代号是Spider(蜘蛛)
支持 lambda支持;
增强日期与时间API的功能;
对垃圾回收的性能也进行了改进,并且移除了permgen区;
Lambdas表达式与Functional接口;
接口的默认与静态方法;
方法引用;
重复注解;
更好的类型推测机制;
扩展注解的支持。
2006年11月 Sun 公司成立了 OpenJDK 开源社区组织,OpenJDK诞生。
2006年11月 Sun 公司成立了 OpenJDK 开源社区组织(不只有OpenJDK中的jdk项目,还有和Java相关的其它开源项目),对源码进行独立管理。
2017年9月,Oracle公司发布了Java SE 9,这次版本升级强化了Java的模块化系统,让庞大的Java语言更轻量化,而且采用了更高效、更智能的GI 垃圾回收器,并在核心类库上进行了大量更新,可以进一步简化编程,但对语法本身更新并不多。
2018年3月,Oracle公司发布了Java SE 10,JDK 10中引入了两个主要的增强功能:JEP 319根证书:列表或根证书已公开给JDK的cacerts密钥库,一些与安全相关的API标记为要删除。
2018年9月25日,JDK 11发布,这也是一个LTS(long-term support)版本,包含17个JEP,同时被引入的还有ZGC这样革命性的垃圾收集器,好比G1的诞生,比G1又更具神秘感。JDK 11中引入的主要安全增强功能由JEP 332:传输层安全性(TLS)1.3提供。 这是TLS协议的新版本,与TLS规范的先前版本(1.2)相比,提供了许多增强功能。 此外,对cacerts密钥库中的根证书进行了更多增强(添加了一些根证书,并删除了一些根证书)。同时Oracle也调整了JDK的授权许可证,把以前的商业许可证授权给OpenJDK,官方宣布同时发布两个JDK,一个是Oracle OpenJDK,一个是OracleJDK,共享大部分源码近乎一致,个人均可免费使用,OpenJDK有半年的更新支持,OracleJDK商用必须付费,且支持三年的更新。之后Oracle公司便以每年发布两个版本的速度升级迭代。
2019年3月20日,JDK 12发布,RedHat接手了OpenJDK 8和OpenJDk 11的管理和维护权。在JDK 12中包含了8个JEP,主要有Switch表达式和JMH测试套件,最引人注目的就是Shenandoah垃圾收集器,作为首个在JDK 7以后非Oracle开发的垃圾收集器,其目标与ZGC一致,这种竞争关系,立马得到了Oracle的抵制,在OracleJDK中剔除代码,因此Oracle JDK和OpenJDK的隔离性又如历史在JDK9中开始重演,至于后续Java的发展,以及迎接的挑战也是任重而道远,这取决于Oracle的产品线的定制和JCP的决策了。
2019年在9月17日,JDK 13发布,这个版本主要通过改善Java SE平台和JDK的性能,稳定性和安全性来提高开发人员的生产力。共包含了5个JEPs和一个Unicode 12.1的支持总共6大主要新特性。
Support for Unicode 12.1 java.lang.Character支持Unicode Character12.1库,相比12.0库新增554个字符。
JEP 351: ZGC Uncommit Unused Memory ZGC增强了对未使用堆内存返还操作系统的能力,ZGC对堆内存的控制能力也从4TB提升至16TB,这个版本对ZGC进行了性能的增强。
JEP 350: Dynamic CDS Archiving 动态归档能力,HostSpotVM对AppCDS的一个增强。
JEP 354: Switch Expressions (Preview)switch表达式的引入,在后面的JDK 17中又继续对其功能进行了增强。
JEP 355: Text Blocks (Preview)增加了Java语言对文本块的支持,但这只是作为一个预览性质的功能,通过””” “””来放置多行代码。
JEP 353: Reimplement the Legacy Socket API 重新实现了java.net.Socket and java.net.ServerSocket 类提供的APIs。
2020年3月17日,JDK 14发布,这个版本主要是对JDK历史版本的一些增强,也引入了一些新增的功能.
JEP 359: Records (Preview) 新增了java.lang.Record类,Record是一种轻量级的class,可以看做是数据结构体。Java作为面向对象的语言诞生以来,在大型项目中的优势就体现出来了,但是也有一点不好,过于繁琐,一个POJO JavaBean必须包含get、set等方法,Record主要就是解决这类问题的,类似于Lombok的功能。
JEP 365: ZGC on Windows
JEP 364: ZGC on macOS
JEP 345: NUMA-Aware Memory Allocation for G1 G1的NUMA感知内存分配。这样可以提高使用非均匀内存体系结构(NUMA)的大型计算机的性能。
JEP 349: JFR Event Streaming 通过启用工具以异步方式订阅Java Flight Recorder事件,这可以对JVM进行更实时的监视。
JEP 363: Remove the Concurrent Mark and Sweep (CMS) Garbage Collector,CMS作为一款主打老年代的并发垃圾收集器,虽然历任JDK中都没有被设置为默认的垃圾收集器,但是在解决STW问题时也是有着举足轻重的地位的,从JDK 7开始筹备到JDK 9作为默认的G1垃圾收集器,一度被认为CMS的升级版,在次CMS也开始走下历史舞台。
JEP 366: Deprecate the ParallelScavenge + SerialOld GC Combination 随着每一代JDk中对垃圾收集器的升级以及新的垃圾收集器的引入,ParallelScavenge + SerialOld(Oracle指出很少有人使用)组合的GC也被弃用了,并在不久的将来被移除,完成了自己的历史使命。
2020年9月15日,JDK 15发布,按照规划路线,JDK 14也停止更新,JDK 15虽然不是LTS版本,但也引入了一些开创性的功能和对早期版本功能的一些优化。
JEP 371: Hidden Classes,
JEP 378: Text Blocks,在JDK 13已经发布的二次预览版本,对于文本块的支持非常友好。
JEP 377: ZGC A Scalable Low-Latency Garbage Collector (Production),这个支持应该算是比较重要的,相比于JDK 11作为实验性质而引入的ZGC,在这两年中ZGC现在已准备好用于生产,不再标记为实验特征,可以直接使用 -XX:+UseZGC开启ZGC,不再需要XX:+UnlockExperimentalVMOptions额外的配置。需要注意的是在OracleJDK中使用的是ZGC,而在OpenJDK中使用的是Shenandoah GC,使用命令-XX:+UseShenandoahGC开启。
2021年3月16日,JDK 16发布,这部分依旧是一些功能的优化升级。
JEP 389: Foreign Linker API (Incubator)提供静态键入的纯-java访问本机代码的API。
JEP 393: Foreign-Memory Access API (Third Incubator)提供了操作外部内存能力的API。
JEP 380: Unix domain sockets java.nio.channels, SocketChannel和ServerSocketChannel新增了对UNIX套接字的支持。
JEP 338: Vector API (Incubator) 提供孵化器模块的初始迭代,JDK.INCUBATOR.Vector,以表达在运行时可靠地编译的向量计算到支持的CPU架构上的最佳矢量硬件指令,从而实现对等效标量计算的卓越性能。这一点在JDK 17上持续增强。
JEP 376: ZGC Concurrent Stack Processing,ZGC的并发标记,不同于CMS的标记,ZGC的标记只有三个阶段,且每一个阶段的操作,无论是标记还是清理都是并发操作,大大降低了STW的时间,几乎零延时。这也算是Java在垃圾回收中比较开创性的变革。
JEP 387: Elastic Metaspace,JDK16对元数据区切分为更小的内存块,并将不再使用的内存快速返还给操作系统,对于频繁加载和卸载类的应用来说这一优化可以产生大量的空闲内存,提升整个JVM的性能。
JEP 397: Sealed Classes (Second Preview),对JDK内部方法提供强制的封装,在JDK 17依然进行了升级优化。
JEP 395: Records,从JDK 14作为预览版被提供在,这里已经升级为正式版功能。
JEP 392: Packaging Tool,新的打包工具,在JDK 14中通过JEP343被提案,在JDK 15中被孵化,在JDK 16中被提升为正式支持使用,通过jpackage命令支持native可执行程序打包。
2021年9月14日,JDK17发布,这也是在JDK 11之后的下一个LTS版本,JDK 17也是Java六个月发布节奏下的最新的长期支持(LTS)发布,主打安全、性能、稳定为特性,并且官方计划支持到2029年9月。在这个版本中包含了14个JEPs更新。
JEP 356: Enhanced Pseudo-Random Number Generator 伪随机数增强器
JEP 391: macOS AArch64 Port 新平台的支持
JEP 410: Remove the Experimental AOT and JIT Compiler 移除了实验性质的AOT和JIT编译器
JEP 411: Deprecate the Security Manager for Removal 弃用安全管理器
JEP 406: Pattern Matching for switch (Preview) switch表达式,这可能是一个让switch翻身的功能。
JEP 412: Foreign Function and Memory API (Incubator) 外函数和内存相关的API,在JDK 14和JDK 15中引入的孵化API,使Java程序能够与Java运行时之外的代码和数据互操作,通过有效地调用外部函数(即,JVM之外的代码),并通过安全访问异物,这些API使Java程序能够调用本机库并进入本机数据而不提供Java本机接口(JNI)的脆性和复杂性。
JEP 414: Vector API (Second Incubator)允许表达在运行时可靠地编译的向量计算以支持的CPU架构上的优化矢量指令,从而实现优于等效标量计算的性能
2022年3月22日,Oracle发布Java SE 18 版本。
2022年9月20日,Oracle发布Java SE 19 版本。
2023年3月21日,Oracle发布Java SE 20版本。
2023年9月19日,Oracle发布Java SE 21 版本。
Spring Boot 3.x 版本最低支持的 JDK 版本为 JDK 17,也就是说如果你还想用 JDK8的话,那能用的最高 Spring Boot 版本为 2.7。
Dubbo 在官方说明中也已经将 JDK 17 作为推荐的版本了。所能用到的一些开源框架或工具包都早已支持最起码 JDK 17 了。JDK 8 不知道还能坚持多久。
JDK21是 LTS(长期支持版),至此为止,目前有 JDK8、JDK11、JDK17和 JDK21这四个长期支持版了。相信用不了多久,JDK21就会取代JDK17的位置,因为JDK21在 JDK17的基础上做了向上增强。
2024年4月16日,Oracle发布Java SE 22版本。