做开发这么多年,最早用jdk6到jdk7,最后稳定使用jdk8至今,期间JDK的版本一直在更新,但是为了系统的稳定性和兼容性,稳用JDK8不动,但是一些新特性还是要了解下的,万一哪天全面升级了呢,毕竟技术都是更新迭代的。
Oracle Java SE 支持路线图
版本 | GA Date | Premier Support Until | Extended Support Until(限LTS) |
---|---|---|---|
8 (LTS) | 2014 年 3 月 | 2022 年 3 月 | 2030 年 12 月 |
9 - 10 (non-LTS) | 2017 年 9 月 - 2018 年 3 月 | 2018 年 3 月 - 2018 年 9 月 | / |
11 (LTS) | 2018年9月 | 2023 年 9 月 | 2032 年 1 月 |
12 - 16 (non-LTS) | 2019 年 3 月 - 2021 年 3 月 | 2019 年 9 月 - 2021 年 9 月 | / |
17 (LTS) | 2021 年 9 月 | 2026 年 9 月或延期 | 2029 年 9 月或延期 |
18 - 20 (non-LTS) | 2022 年 3 月 - 2023 年 3 月 | 2022 年 9 月 - 2023 年 9 月 | / |
21 (LTS) | 2023 年 9 月 | 2028 年 9 月或延期 | 2031 年 9 月或延期 |
22 (non-LTS) | 2024 年 3 月 | 2024 年 9 月 | / |
- JDK 的标准更新周期为 6 个月
- Java SE 8 的公共更新已经结束,将不再提供免费商用更新。
- Oracle 自 2017 年 9 月开始提供 基于 GPLv2 开源的 Oracle OpenJDK
- Oracle JDK 16 及以前的版本不可免费商用
- Oracle JDK 17 及以上版本,自 2021 年 9 月起,提供免费使用许可
-
LTS,意为长期支持,LTS 版本更加注重稳定性,安全性,性能改进,默认支持是 8 年,其中 JDK 8 延长至 2030 年(16年),延长支持期间不再提供新的功能。LTS 版本自 2021 年起,从 3 年发布一次更改为 2 年一次。
-
官方说明:JDK
1.JDK9新特性
-
模块化
-
提供了List.of()、Set.of()、Map.of()和Map.ofEntries()等工厂方法
-
接口支持私有方法
-
Optional 类改进
-
多版本兼容Jar包
-
JShell工具
-
try-with-resources的改进
-
Stream API的改进
-
设置G1为JVM默认垃圾收集器
-
支持http2.0和websocket的API
2.JDK10新特性
-
通过var关键字实现局部变量类型推断,编译之后会推断出值的真实类型
-
不可变集合的改进
-
JVM的G1垃圾回收由单线程改成多线程并行处理,降低G1的停顿时间
-
线程本地握手,允许在不执行全局VM安全点的情况下执行线程回调,可以停止单个线程,而不需要停止所有线程或不停止线程
-
Optional新增orElseThrow()方法
-
类数据共享
-
Unicode 语言标签扩展
-
根证书
3.JDK11新特性(LTS版本)
-
字符串加强,增加字符串处理方法
-
用于 Lambda 参数的局部变量语法
-
Http Client重写,支持HTTP/1.1和HTTP/2 ,也支持 websockets
-
可运行单一Java源码文件
-
ZGC:可伸缩低延迟垃圾收集器,ZGC可以看做是G1之上更细粒度的内存管理策略。由于内存的不断分配回收会产生大量的内存碎片空间,因此需要整理策略防止内存空间碎片化,在整理期间需要将对于内存引用的线程逻辑暂停,这个过程被称为"Stop the world"。只有当整理完成后,线程逻辑才可以继续运行。(并行回收)
-
支持 TLS 1.3 协议
-
Flight Recorder(飞行记录器),基于OS、JVM和JDK的事件产生的数据收集框架
-
对Stream、Optional、集合API进行增强
4.JDK12新特性
-
Switch 表达式扩展,试用->可以有返回值
-
新增NumberFormat对复杂数字的格式化
-
字符串支持transform、indent操作
-
新增方法Files.mismatch(Path, Path)
-
Teeing Collector
-
支持unicode 11
-
Shenandoah GC,新增的GC算法
-
G1收集器的优化,将GC的垃圾分为强制部分和可选部分,强制部分会被回收,可选部分可能不会被回收,提高GC的效率
5.JDK13新特性
-
Switch 表达式扩展,switch表达式增加yield关键字用于返回结果,作用类似于return,如果没有返回结果则使用break
-
文本块升级 """ ,引入了文本块,可以使用"""三个双引号表示文本块,文本块内部就不需要使用换行的转义字符
-
SocketAPI 重构,Socket的底层实现优化,引入了NIO
-
FileSystems.newFileSystem新方法
-
ZGC优化,增强 ZGC 释放未使用内存,将标记长时间空闲的堆内存空间返还给操作系统,保证堆大小不会小于配置的最小堆内存大小,如果堆最大和最小内存大小设置一样,则不会释放内存还给操作系统
6.JDK14新特性
-
instanceof模式匹配,简化语法可以直接给对象赋值
-
引入Record类型,可以自动生成构造器、equals、getter等方法;
-
Switch 表达式标准化
-
改进 NullPointerExceptions提示信息,打印具体哪个方法抛的空指针异常,避免同一行代码多个函数调用时无法判断具体是哪个函数抛异常的困扰,方便异常排查;
-
删除 CMS 垃圾回收器
7.JDK15新特性
-
EdDSA 数字签名算法
-
Sealed Classes(封闭类,预览),通过sealed关键字修饰抽象类限定只允许指定的子类才可以实现或继承抽象类,避免抽象类被滥用
-
Hidden Classes(隐藏类)
-
移除 Nashorn JavaScript引擎
-
改进java.net.DatagramSocket 和 java.net.MulticastSocket底层实现
8.JDK16新特性
-
允许在 JDK C ++源代码中使用 C ++ 14功能
-
ZGC性能优化,去掉ZGC线程堆栈处理从安全点到并发阶段
-
增加 Unix 域套接字通道
-
弹性元空间能力
-
提供用于打包独立 Java 应用程序的 jpackage 工具
9.JDK17新特性(LTS版本)
-
Spring 6 和 Spring Boot 3使用JDK17
-
移除实验性的 AOT 和 JIT 编译器
-
恢复始终执行严格模式 (Always-Strict) 的浮点定义
-
正式引入密封类sealed class,限制抽象类的实现
-
统一日志异步刷新,先将日志写入缓存,然后再异步刷新
10.JDK18新特性
- 默认UTF-8编码
- 简易Web服务器
- 支持在 Java API 文档中加入代码片段
- 用方法句柄重新实现核心反射
- 向量 API(第三孵化器)
- 互联网地址解析 SPI
- 外部函数和内存 API(第三孵化器)
- 模式匹配 Switch 表达式(预览)
- 弃用 Finalization 功能
11.JDK19新特性
- Record模式(预览)
- JDK移植到Linux/RISC-V
- 外部函数和内存API(预览)
- 虚拟线程(预览)
- 向量API(第四次孵化)
- 模式匹配的 Switch(第三次预览)
- 结构化并发(孵化功能)
12.JDK20新特性
- 作用域值(第一次孵化)
- Record 模式(第二次预览)
- 模式匹配的 Switch 表达式(第四次预览)
- 外部函数与内存 API(第二次预览)
- 虚拟线程(第二次预览)
- 结构化并发(第二次孵化)
- 向量 API(第五次孵化)
13.JDK21新特性(LTS版本)
- 虚拟线程,轻量级线程,大幅提升IO吞吐型互联网应用的并发能力,消耗很小的资源即可进行多线程编程,无需池化,告别线程池数量调参
- switch里支持模式匹配、支持对record模式匹配
- List取第一个、最后一个元素、反转List更方便了
- SimpleFileServer,轻量级http web server,java版nginx,支持本地二级目录路由、反向代理等。
- 分代ZGC,对ZGC进行了改进升级。
14.JDK22新特性
- 增强了Java跨语言能力
- 可替代JNI来调C/C++的本地库