目录
3.1 Java中JDK8、JDK11、JDK17,该怎么选择?
3.3 Oracle Java SE支持路线图|Oracle 中国
一、名词说明
1.1 LTS版本
LTS,原名 Long-Term Support 长期支持,正常情况下 当 JDK 12 正式发布后 JDK 11 将失效,但是由于 JDK 11 是 LTS 版本,所以会延长支持更新至 2032 年。
LTS 版本更加注重稳定性,安全性,性能改进,默认支持是 8 年,其中 JDK 8 延长至 2030 年(16年),延长支持期间不再提供新的功能。
LTS 版本自 2021 年起,从 3 年发布一次更改为 2 年一次
1.2属于LTS的JDK版本
JDK8, JDK11, JDK17, JDK21
二、JDK各版本特性
2.1 JDK8(2014-03, LTS)
- 接口默认方法
允许在接口中定义默认实现。
- lambda表达式
引入了函数式编程的特性,使得代码更加简洁和灵活。
- 函数式接口
- streamAPI
- 新的日期工具类
- Nashorn JavaScript 引擎
一个新的轻量级 JavaScript 运行时,允许在 JVM 上执行 JavaScript 代码。
- 性能改进
JDK 8 在垃圾回收器和 JIT 编译器方面进行了优化,提高了性能。
2.2 JDK9(2017-09)
主要:是API的优化,如支持HTTP2的Client API、JVM采用G1为默认垃圾收集器。
- 模块化
即只加载应用运行需要的模块
- JShell
一个新的交互式命令行工具,允许开发者逐行执行 Java 代码,并立即看到结果。
- 改进的Java doc
生成的Java doc符合H5标准,支持API搜索 - HTTP/2
新的方式处理HTTP调用,用于替换 HttpURLConnection,并提供对WebSocket和HTTP/2的支持。 - 改进的 Stream API
增加了新的中间操作和终端操作,使得 Stream API 更加强大。
- 集合工厂方法
在 java.util.Collections 中增加了一些新的静态工厂方法,用于创建不可修改的集合。
- 处理进程
引入了 java.lang.ProcessHandle 类,提供了对操作系统进程的更细粒度控制。
2.3 JDK10(2018-03)
主要:通过var关键字实现局部变量类型推断,使Java语言变成弱类型语言、JVM的G1垃圾回收由单线程改成多线程并行处理,降低G1的停顿时间。
- 改进的垃圾回收器
并行full gc的G1,通过并行Full GC, 改善G1的延迟。目前对G1的full GC的实现采用了单线程-清除-压缩算法。JDK10开始使用并行化-清除-压缩算法。 - 基于实验Java的JIT编译器
启用基于Java的JIT编译器Graal,它是JDK9中引入的Ahead-of-time(AOT)编译器的基础。 - 局部变量类型推断
在 JDK 10 中,局部变量的类型推断(var 关键字)被引入,这使得代码更加简洁。
- HTTP 客户端 API
提供了一个新的 HTTP 客户端 API,用于简化 HTTP 请求的发送和处理。
2.4 JDK11(2018-09, LTS)
主要:对于JDK9和JDK10的完善,主要是对于Stream、集合等API的增强、新增ZGC垃圾收集器。
- HttpClient增强
同时提供了同步调用和异步调用实现。JDK对http对调用支持已经足够强,以前apache提供的httpComponents基本可以去除了。 - ZGC
JDK11最瞩目的特性,但目前是实验性质的。目标是GC暂停时间不会超过10ms,既能处理几百兆的小堆,也能处理几个T的大堆。 - 完全支持Linux容器
JDK10开始,JVM可以识别当前是否在容器中运行,能接受容器设置的内存限制和CPU限制。 - Flight Recorder
引入了 Flight Recorder,这是一个低开销的事件记录系统,用于监控和诊断 JVM 的性能问题。
- Epsilon 垃圾回收器
作为一个实验性的垃圾回收器,Epsilon GC 旨在为某些特定的应用场景提供更好的性能。
- 改进的 AArch64(ARM64)支持
JDK 11 对 ARM64 架构提供了更好的支持,使得 Java 应用程序可以在更多的设备上运行。
- 移除 Nashorn 引擎和 CORBA 模块
这两个特性在 JDK 11 中被移除,以减少 JDK 的体积和复杂性。
2.5 JDK12(2019-03)
主要:switch表达式语法扩展、G1收集器优化、新增Shenandoah GC垃圾回收算法。
- 优化swich使用
2.6 JDK13(2019-09)
主要:ZGC优化,释放内存还给操作系统、socket底层实现引入NIO。
- 优化字符串拼接
- 优化Socket API
2.7 JDK14(2020-03)
- gc相关
删除CMS;弃用 ParallelScavenge + SerialOld GC 的垃圾回收算法组合;将 zgc 垃圾回收器移植到 macOS 和 windows 平台。
- instanceof扩展
- NullPointerException打印信息增强,定位错误
2.8 JDK15(2020-09)
- RMI Actiation被标记为Deprecate,在JDK17中删除。
RMI远程方法调用,在JDK1.2中引入,为分布式提供延迟加载方式,已被web服务器替代。
- JEP 339 Edwards-Curve Digital Signature Algorithm (EdDSA)
实现了EdDSA椭圆曲线签名算法。 - JEP 384 Records (Second Preview)
引入了Record类型,解决定义大量get/set方法的问题,可一定程度替代掉lomobok - 移除Nashorn JavaScipt引擎
2.9 JDK16(2021-03)
- 387: 弹性Metaspace功能可将未使用的HotSpot虚拟机的Class Metadata(Metaspace)占用的内存更迅速的返回给操作系统,从而减少Metaspace的占用并简化Metaspace的代码以降低维护成本。
- 388: 将JDK移植到Windows/AArch64平台。
- 392: 提供用于打包独立的Java应用程序的jpackage工具。
2.10 JDK17(2021-09, LTS)
主要:对前几个版本的整合和完善。Spring 6和SpringBoot3需要JDK17。
- JDK 内部的强封装,除了sun.misc.Unsafe等关键的内部 API 外,用户将不再可能通过单个命令行选项来 relax 对内部元素的强封装,这在 JDK 9 到 JDK 16 中是可行的。该计划的目标包括提高 JDK 的安全性和可维护性,并鼓励开发人员从内部元素迁移到标准 API。
- 删除远程方法调用 (RMI) 激活机制,同时保留 RMI 的其余部分。
- 删除实验性 AOT 和 JIT 编译器,它们几乎没有使用,但需要大量维护工作。该计划要求维护 Java 级别的 JVM 编译器接口,以便开发人员可以继续使用外部构建的编译器版本进行 JIT 编译。
- 将 JDK 移植到 MacOS/AArch64 以响应 Apple 将其 Macintosh 计算机从 x64 转换到 AArch64 的计划(Apple M1处理器)。针对 MacOS/AArch64 的更改有可能破坏现有的 Linux/AArch64、Windows/AArch64 和 MacOS/x64 port,但这种风险可通过预集成测试来降低。
- 弃用 Applet API 以进行删除。这个 API 本质上是无关紧要的,因为所有 Web 浏览器供应商要么已经取消了对 Java 浏览器插件的支持,要么已经宣布了这样做的计划。Applet API 之前在 2017 年 9 月的 Java 9 中已被弃用,但并未删除。Applet API彻底被删除,最早java就是靠applet开始火的。
- 弃用 Security Manager,准备在未来版本中移除。追溯到 Java 1.0,Security Manager 一直是保护客户端 Java 代码的主要手段,很少用于保护服务器端代码。该提案的一个目标是评估是否需要新的 API 或机制来解决使用 Security Manager 的特定狭窄用例,例如阻塞System::exit。计划要求弃用 Security Manager 以与旧 Applet API 一起删除,该 API 也计划在 JDK 17 中弃用。
2.11 JDK18(2022-03)
- Javadoc中支持代码片段
从JDK18开始,可以使用@snippet来生成注释,且可以高亮某个代码片段
- 默认UTF-8字符编码
- 简单的Web服务器
JDK18中提供了一个新命令jwebserver, 运行这个命令可以启动一个简单的,最小化的静态web服务器,默认发布的是当前目录
- 使用方法句柄重新实现反射核心功能
JDK18改进了java.lang.reflect.Method, Constructor的实现逻辑,使得性能更佳。 不涉及到API的变动,只要升级到该版本,就能享受到更好的性能。 - 互联网地址解析 SPI
对于互联网地址解析 SPI,为主机地址和域名地址解析定义一个 SPI,以便 java.net.InetAddress 可以使用平台内置解析器以外的解析器。
2.12 JDK19(2022-09)
- 405: Record记录模式(预览)
- 422: Linux/RISC-V 端口
- 424: 外部函数和内存 API(预览版)
- 425: 虚拟线程(预览)
- 426: Vector API(第四孵化器)
- 427: 开关的模式匹配(第三次预览)
- 428: 结构化并发(孵化器)
2.13 JDK20****(2023-03)****
- 429:Scoped Values范围值(孵化器)
- 432:Record记录模式(第二次预览)
- 433:开关的模式匹配(第四次预览)
- 434:外部函数和内存 API(第二预览版)
- 436:虚拟线程(第二预览版)
- 437:结构化并发(第二个孵化器)
- 438:Vector API(第五孵化器)
2.14 ****JDK21 (****2023-09, LTS)
- 430: 字符串模板(预览)
- 431: 有序集合
- 439: 世代ZGC
- 440: 记录模式
- 441: 开关的模式匹配
- 442: 外部函数和内存 API(第三次预览版)
- 443: 未命名模式和变量(预览)
- 444: 虚拟线程
- 445: 未命名类和实例主要方法(预览)
- 446: 范围值(预览)
- 448: Vector API(第六个孵化器)
- 449: 弃用 Windows 32 位 x86 端口以进行删除
- 451: 准备禁止动态加载代理
- 452: 密钥封装机制API
- 453: 结构化并发(预览版)
2.15 JDK22 (2024-03)
- 423: G1 的区域固定
- 447: super(…) 之前的语句(预览)
- 454: 外部函数和内存 API
- 456: 未命名变量和模式
- 457: 类文件 API(预览版)
- 458: 启动多文件源代码程序
- 459: 字符串模板(第二次预览)
- 460: Vector API(第七个孵化器)
- 461: 流收集器(预览)
- 462: 结构化并发(第二预览版)
- 463: 隐式声明的类和实例主要方法(第二预览版)
- 464: 范围值(第二次预览版)
三、相关文献
3.1 Java中JDK8、JDK11、JDK17,该怎么选择?
Java中JDK8、JDK11、JDK17,该怎么选择?-腾讯云开发者社区-腾讯云
3.2 JDK各版本文档以及迁移说明
Java Platform, Standard Edition Documentation - Releases
3.3 Oracle Java SE支持路线图|Oracle 中国
Oracle Java SE Support Roadmap | Oracle 中国
**博主介绍:上海交大毕业,大厂资深Java后端工程师,
《Java全套学习资料》作者,
专注于系统架构设计和高并发解决方案和面试辅导
阿里云开发社区乘风者计划专家博主
/**
* @author[vx] vip1024p(备注java)
* @【描述:浏览器打开】docs.qq.com/doc/DUkVoZHlPeElNY0Rw
*/
public class Hello {
public static void main(String[] args) {
System.out.println("Hello!!!");
}
}