JDK 版本演进及主要特性
本文记录JDK版本演进历史及各版本主要特性。
JDK 1.0
1996年1月发布,主要特性:
- Classic VM,虚拟机
- Applet,Java小程序
- AWT图形设计
JDK 1.1
1997年2月发布,主要特性:
- AWT事件模型大规模重新编制
- Inner Class
- JavaBeans
- JDBC
- RMI
- Reflection
- 针对Windows版本附带由Symantec为JavaSoft生产的JIT编译器
- 支持国际化和Unicode
J2SE 1.2
1998年12月发布,主要特性:
- J2SE、J2EE、J2ME
- EJB
- Java IDL,平台对象请求代理体系结构
- 集合框架
-
strictfp
关键字 - 首次为Sun提供的JVM配备JIT编译器
- 数字签名
- JFC(Java Foundation Classes),包括Swing1.0、拖放及Java2D类库
- Java Plug-In运行插件
- JDBC中引入可滚动结果集,BLOB,CLOB,批量更新和用户自定义类型
- Applet中添加声音支持
- 字符串常量做内存映射
- 控制授权,访问系统资源的策略工具
HotSpot虚拟机
1999年4月27日发布,作为J2SE 1.2的附加程序,后来成为J2SE 1.3及之后版本的默认虚拟机。
J2SE 1.3
2000年5月发布,主要特性:
- Timer API
- 主程序库中合入JNDI(Java Naming and Directory Interface,Java命名和目录接口)
- Java Sound API
- 为了支持与CORBA的选择兼容性而修改了RMI
- JPDA(Java Platform Debugger Architecture)
J2SE 1.4
2002年2月发布,第一个在JCP下开发的Java平台,Java计算能力有了大幅提升,主要特性:
-
assert
断言关键字,JSR 41 - Java打印服务
- Logging API,JSR 47
- Java Web Start,JSR 56
- JDBC 3.0 API
- Preferences API
- 链式异常处理,允许一个异常封装原先处于较低级别的异常
- 支持IPv6
- 正则表达式,仿照Perl
- Image I/O API,支持JPEG、PNG格式
- NIO(Nonblocking Input/Output,非阻塞I/O),JSR 51
- 集成了XML解析器和XSLT处理器(JAXP),JSR 5 & JSR 63
- 集成安全和加密扩展组件(JCE,JSSE,JAAS)
- 首选项API
java.util.prefs
J2SE 5.0
2004年9月发布,Java里程碑版本,为标识该版本的重要性,从这个版本对外不再使用1.x
的版本号命名规则,主要特性:
- 泛型(Generics),为集合提供编译期间(静态)类型安全,且不需为大多数类型转换,JSR 14
- 增强
for
循环,JSR 201 - 自动装箱和自动拆箱,包装类型包括:
Integer
、Double
、Float
、Long
、Short
、Character
、Boolean
,JSR 201 - 类型安全的枚举(Enumerations),JSR 201
- 可变长度参数
- 静态引入
import static
- 元数据,注解,JSR 175
- 线程并发库
java.util.concurrent
Java SE 6
2006年12月发布,Java的各种版本重新更名,J2EE更名为JavaEE,J2SE更名为JavaSE,J2ME更名为JavaME,主要特性:
-
java.awt
新增Desktop
类和SystemTray
类 - JDBC 4.0,JSR 221
- 升级JAXB到2.0版本,包括集成STAX解析器,处理XML文档的API
- 轻量级HTTP Server API
- 插入式注解(pluggable annotations)处理API,lombok基于该特性实现,JSR 269
- Compiler API
- 对脚本语言的支持(Ruby/Groovy/JavaScript),JSR 223
- Java编译器API,允许Java程序以写程序的方式选择和调用Java编译器API,JSR 199
Java SE 7
2011年7月发布,主要特性:
-
switch
支持String
字符串类型 -
try-with-resources
,资源自动关闭 - 整数类型能够用二进制表示
- 允许在数值字面值中加入下划线
- 泛型实例化类型自动推断(
<>
) -
catch
捕获多个异常类型,用|
分隔 - 全新的NIO 2.0 API
- Fork&Join并行执行任务框架
- 简化了varargs方法的声明
- JVM本身对动态语言的支持,新的
invokedynamic
字节码指令(JSR 292),多语言虚拟机(Multi Language Virtual Machine)原型 - 64位指针压缩,可以使用
XX:+UseCompressedOops
开启 - JSR 166下的并发使用工具
- 新的文件I/O程序库(JSR 203)增加多重文件的支持、文件原始资料和符号链接,新包:
java.nio.file
、java.nio.file.attribute
、java.nio.file.spi
- 使用Timsort为集合与数组排序,取代归并排序
- 对椭圆曲线加密算法增加标准库级别支持
- 增强对新网络通信协议(包括SCTP和Sockets Direct Protocol)的标准库级别的支持
- 更新对XML和Unicode的支持,以符合最新标准
Java SE 8 LTS
2014年3月发布,主要特性:
- JSR 335,JEP 126:Lambda项目中提供的语言级匿名函数支持(官方称为Lambda表达式,非官方亦称为闭包)
- JSR 223,JEP 174:Nashorn项目,一个JavaScript运行时,允许开发人员在应用程序中嵌入JavaScript代码
- JSR 308,JEP 104:在Java类型上的注解
- JSR 337,JEP 120:重复注解
Repeatable
- JSR 310,JEP 150:日期和时间API,基于Joda-Time日期时间处理库的实现
- JEP 178:静态连接JNI程序库
- JEP 153:执行JavaFX应用程序(直接执行JavaFX的应用程序的JAR包)
- JEP 122:移除了虚拟机内存管理中的永久世代,使用元空间Metaspace代替
- 无符号整数算术
- 函数式接口
- 方法引用
- 接口默认方法
- Stream API
-
Optional
解决NullPointerException
- Base64
Java SE 9
2017年9月发布,非LTS版本,OpenJDK于2018年3月停止更新,主要特性:
- JSR 376:在Jigsaw项目中将JDK模块化
- JEP 222:JShell
- JEP 295:AOT编译(通过Graal VM实现)
- JEP 268:XML Catalogs
- JEP 266:更多的并发更新,包含响应式流的Java实现,及其部分替代品
java.util.concurrent.Flow
- JEP 193:变量句柄,定义一个标准方法来调用
java.util.concurrent.atomic
和sun.misc.Unsafe
操作的等价物 - JEP 282:jlink,Java链接器,该工具可以为模块生成一个包含了其所有依赖项的自定义运行时映像,同时允许生成一个包括运行它的JVM的可执行文件
- JavaDB被移出JDK
- JEP 263:高DPI图像,自动缩放与尺寸自适应
- 提供
List.of()
、Set.of()
、Map.of()
和Map.ofEntries()
等工厂方法 - 接口支持私有方法
-
Optional
类改进 - 多版本兼容JAR包
- try-with-resources改进
- Stream API改进
Java SE 10
2018年3月发布,非LTS版本,OpenJDK于2018年9月停止更新,主要特性:
- JEP 286:局部变量类型推断
- JEP 317:实验性的基于Java的JIT编译器,Linux x64下Graal动态编译器的集成
- JEP 310:应用程序类级别数据共享
- JEP 322:基于时间的版本命名
- JEP 307:适用于G1的多线程完全垃圾回收
- JEP 304:垃圾回收器接口
- JEP 314:更多的Unicode语言标签扩展
- JEP 319:内置根证书
- JEP 312:线程本地握手
- JEP 316:在可选的内存设备上申请堆内存空间
- JEP 313:删除本地代码头文件生成器javah
- JEP 296:将所有JDK分支集成到同一个版本库中
- 不可变集合改进
-
Optional
新增orElseThrow()
方法
Java SE 11
2018年9月发布,LTS版本,AdoptOpenJDK于2024年10月或之后停止更新,Amazon Corretto于2027年9月或之后停止更新,最后延伸支持日期:2026年9月。
主要特性:
- JEP 181:针对嵌套成员的访问控制
- JEP 309:动态类文件常量
- JEP 315:利用Aarch64的特有架构改进其上的性能
- JEP 318:Epsilon,无操作垃圾收集器
- JEP 320:移除Java EE和CORBA模块
- JEP 321:HTTP Client重写,支持HTTP/1.1和HTTP/2,也支持websockets
- JEP 323:Lambda参数的局部变量语法
- JEP 324:支持Curve25519和Curve 448密钥
- JEP 327:Unicode 10
- JEP 328:添加Java飞行记录器(JFR),其用于创建性能分析记录
- JEP 329:ChaCha20和Poly1305加密算法
- JEP 330:运行单文件源码程序
- JEP 331:低开销堆分析
- JEP 332:支持TLS 1.3
- JEP 333:添加ZGC(一个可扩展的低延迟垃圾收集器)
- JEP 335:弃用Nashorn JavaScript引擎
- JEP 336:弃用Pack200相关的工具及API
- 增加一些字符串处理方法
Java SE 12
2019年3月发布,非LTS版本,OpenJDK于2019年9月停止更新,主要特性:
- JEP 189:Shenandoah,一个实验性的低延迟垃圾收集器
- JEP 230:细粒度性能评审包
- JEP 325:Switch表达式扩展(预览阶段)
- JEP 334:JVM Constants API
- JEP 340:仅保留一个AArch64平台的移植
- JEP 341:默认类数据共享归档
- JEP 344:针对G1,提供可中止的混合垃圾收集
- JEP 346:针对G1,及时释放已申请但未使用的内存
- 新增
NumberFormat
对复杂数字的格式化 - 字符串支持
transform
、indent
操作 - 新增方法
Files.mismatch(Path, Path)
- Teeing Collector
- 支持Unicode 11
Java SE 13
2019年9月发布,非LTS版本,OpenJDK于2020年3月停止更新,主要特性:
- JEP-350:动态CDS归档
- JEP-351:增强ZGC释放未使用内存
- JEP-353:重新实现旧版Socket API
- JEP-354:Switch表达式扩展,引入
yield
关键字(预览版本) - JEP-355:文本框(预览阶段)
- 增强ZGC释放未使用内存
Java SE 14
2020年3月发布,非LTS版本,OpenJDK于2020年9月停止更新,主要特性:
- JEP-305:使用
instanceof
的模式匹配(预览) - JEP-343:打包工具(孵化中)
- JEP-345:在G1中,对不均匀的内存访问(NUMA)情况下的内存申请优化
- JEP-349:JFR Event Streaming
- JEP-352:使字节缓冲区能够映射到非易失性存储器上
- JEP-358:有帮助的
NullPointerExceptions
- JEP-359:记录类(预览)
- JEP-361:Switch表达式(标准)
- JEP-362:弃用Solaris和SPARC平台上的移植版本
- JEP-363:移除Concurrent Mark Sweep(CMS)垃圾收集器
- JEP-364:适用于MacOS的ZGC
- JEP-365:适用于Windows的ZGC
- JEP-366:弃用ParallelScavenge+SerialOld的垃圾收集器组合
- JEP-367:移除Pack200相关的工具及API
- JEP-368:文本块(第二预览版本)
- JEP-370:外部内存访问API(孵化中)
-
Record
类型,类似于Lombok的@Data
注解
Java SE 15
2020年9月发布,非LTS版本,OpenJDK于2021年3月停止更新,主要特性:
- JEP 339:Edwards-Curve数据签名算法(EdDSA),EdDSA是一种现代的椭圆曲线签名方案
- JEP 360:封闭类(预览)Sealed Classes,可以是封闭类或封闭接口,防止其他类或接口扩展或实现
- JEP 371:隐藏类Hidden Classes,不能直接被其他类的字节码使用,只能在运行时生成类并通过反射间接使用它们
- JEP 372:移除Nashorn JavaScript脚本引擎、APIs及jjs工具
- JEP 373:重新实现
DatagramSocket
API接口,更改java.net.DatagramSocket
和java.net.MulticastSocket
为更简单的底层实现,更易于维护和调试,新的底层实现将很容易使用虚拟线程 - JEP 374:准备禁用和废除偏向锁
- JEP 375:使用
instanceof
的模式匹配(第二次预览) - JEP 377:ZGC,一个可伸缩、低延迟的垃圾回收器
- JEP 378:文本块
"""
- JEP 379:Shenandoah,一个低停顿时间的垃圾回收器
- JEP 381:移除Solaris和SPARC端口,移除了Solaris/SPARC、Solaris/x64和Linux/SPARC端口的源代码及构建支持
- JEP 383:外存访问API(孵化),可以允许Java应用程序安全有效地访问Java堆之外的外部内存
- JEP 384:Records(第二次预览),某些场合可以干掉Lombok,能自动生成类构造器、
toString()
、hashCode()
、equals()
以及类似getter
的变量访问方法 - JEP 385:废除RMI激活,RMI激活是RMI种一个过时的组件
Java SE 16
2021年3月发布,非LTS版本,OpenJDK与2021年9月停止更新,主要特性:
- JEP 338:提供了
jdk.incubator.vector
来用于矢量计算 - JEP 347:在JDK C++的源码中允许使用C++14的语言特性
- JEP 357:OpenJDK源码的版本控制从Mercurial(hg)迁移到git
- JEP 369:将OpenJDK源码的版本控制迁移到GitHub上
- JEP 376:ZGC,实现了并发thread-stack处理来降低GC safepoints的负担
- JEP 380:对socket channel及server socket channel的api提供对unix domain socket的支持
- JEP 386:将glibc的jdk移植到使用musl的alpine linux上
- JEP 387:支持不再使用的class metadata归还内存给操作系统,降低内存占用
- JEP 388:移植JDK到Windows/AArch64
- JEP 389:提供
jdk.incubator.foreign
来简化native code的调用 - JEP 390:提供
@jdk.internal.ValueBased
来用于标注作为value-based的类 - JEP 392:jpackage在JDK14引入,JDK15作为incubating工具,在JDK16转正,从
jdk.incubator.jpackage
转为jdk.jpackage
,它支持Linux:deb & rpm,MacOS:pkg & dmg,Windows:msi & exe
Java SE 17
2021年9月发布,LTS版本,Azul于2029年9月停止更新,Microsoft于2027年9月停止更新,最后延伸支持日期:2029年9月。
主要特性:
- JEP 306:恢复始终执行严格模式的浮点定义,修复25年前英特尔的浮点指令存在的一些问题
- JEP 356:引入
RandomGenerator
及RandomGeneratorFactory
提供更好的随机数生成 - JEP 382:使用Apple Metal API为MacOS新增了Java 2D internal rendering pipeline
- JEP 391:迁移JDK到MacOS/AArch64
- JEP 398:标记Applet API为废弃方便后续移除
- JEP 403:对JDK内部的API进行更强的封装
- JEP 406:引入switch模式匹配的preview版本,
instanceof
的模式匹配在JDK14作为preview,在JDK15作为第二轮的preview,在JDK16转正 - JEP 407:移除Remote Method Invocation(RMI),它在JDK15的JEP 385被废弃
- JEP 409:Sealed Classes在JDK15作为preview引入,在JDK16作为第二轮preview,在JDK17转正
- JEP 410:移除实验性的Java版本的AOT及JIT Compiler
- JEP 411:废弃Java1.0引入的Security Manager方便后续移除
- JEP 412:引入Foreign Function & Memory API
- JEP 414:JDK 16引入了Vector API(Incubator)提供了
jdk.incubator.vector
来用于矢量计算,JDK17进行改进并作为第二轮incubator - JEP 415:允许应用去配置指定上下文及动态选择的deserialization filters