JDK的版本迭代特性(JDK9 - JDK20)

简介: JDK的版本迭代特性(JDK9 - JDK20)

1. 发布特点

发行版本 发行时间 备注
Java 1.0 1996.01.23 Sun公司发布了Java的第一个开发工具包
Java 5.0 2004.09.30 ①版本号从1.4直接更新至5.0;②平台更名为JavaSE、JavaEE、JavaME
Java 8.0 2014.03.18 此版本是继Java 5.0以来变化最大的版本。是长期支持版本(LTS
Java 9.0 2017.09.22 此版本开始,每半年更新一次
Java 10.0 2018.03.21
Java 11.0 2018.09.25 JDK安装包取消独立JRE安装包,是长期支持版本(LTS
Java 12.0 2019.03.19
Java17.0 2021.09 发布Java 17.0,版本号也称为21.9,是长期支持版本(LTS
Java19.0 2022.09 发布Java19.0,版本号也称为22.9。

从Java 9 这个版本开始,Java 的计划发布周期是 6个月

这意味着Java的更新从传统的以特性驱动的发布周期,转变为以时间驱动的发布模式,并且承诺不会跳票。通过这样的方式,开发团队可以把一些关键特性尽早合并到 JDK 之中,以快速得到开发者反馈,在一定程度上避免出现像 Java 9 两次被迫延迟发布的窘况。

针对企业客户的需求,Oracle 将以三年为周期发布长期支持版本(long term support)。

Oracle 的官方观点认为:与 Java 7->8->9 相比,Java 9->10->11的升级和 8->8u20->8u40 更相似。

新模式下的 Java 版本发布都会包含许多变更,包括语言变更JVM 变更,这两者都会对 IDE、字节码库和框架产生重大影响。此外,不仅会新增其他 API,还会有 API被删除(这在 Java 8 之前没有发生过)。

目前看这种发布策略是非常成功的,解开了 Java/JVM 演进的许多枷锁,至关重要的是,OpenJDK 的权力中心,正在转移到开发社区和开发者手中。 在新的模式中,既可以利用 LTS 满足企业长期可靠支持的需求,也可以满足各种开发者对于新特性迭代的诉求。因为用 2-3 年的最小间隔粒度来试验一个特性,基本是不现实的。

2. 名词解释

Oracle JDK和Open JDK

这两个JDK最大不同就是许可证不一样。但是对于个人用户来讲,没区别。

Oracle JDK Open JDK
来源 Oracle团队维护 Oracle和Open Java社区
授权协议 Java 17及更高版本 Oracle Java SE 许可证
Java16及更低版本甲骨文免费条款和条件 (NFTC) 许可协议
GPL v2许可证
关系 由Open JDK构建,增加了少许内容
是否收费 2021年9月起Java17及更高版本所有用户免费。 16及更低版本,个人用户、开发用户免费。 2017年9月起,所有版本免费
对语法的支持 一致 一致

JEP

JEP(JDK Enhancement Proposals):jdk 改进提案,每当需要有新的设想时候,JEP可以提出非正式的规范(specification),被正式认可的JEP正式写进JDK的发展路线图并分配版本号。

LTS

LTS(Long-term Support)即 长期支持 。Oracle官网提供了对Oracle JDK个别版本的长期支持,即使发发行了新版本,比如目前最新的JDK19,在结束日期前,LTS版本都会被长期支持。(出了bug,会被修复,非LTS则不会再有补丁发布)所以,一定要选一个LTS版本,不然出了漏洞没人修复了。

版本 开始日期 结束日期 延期结束日期
7(LTS) 2011年7月 2019年7月 2022年7月
8(LTS) 2014年3月 2022年3月 2030年12月
11(LTS) 2018年9月 2023年9月 2026年9月
17(LTS) 2021年9月 2026年9月 2029年9月
21(LTS) 2023年9月 2028年9月 2031年9月

如果要选择Oracle JDK,目前可选的LTS版本为8、11、17三个。

3. 各版本支持时间路线图

4. 各版本介绍

jdk 9

Java 9 提供了超过150项新功能特性,包括备受期待的模块化系统、可交互的 REPL 工具:jshell,JDK 编译工具,Java 公共 API 和私有代码,以及安全增强、扩展提升、性能管理改善等。

特性太多,查看链接:

https://openjdk.java.net/projects/jdk9/

jdk 10

https://openjdk.java.net/projects/jdk/10/

286: Local-Variable Type Inference 局部变量类型推断

296: Consolidate the JDK Forest into a Single Repository JDK库的合并

304: Garbage-Collector Interface 统一的垃圾回收接口

307: Parallel Full GC for G1 为G1提供并行的Full GC

310: Application Class-Data Sharing 应用程序类数据(AppCDS)共享

312: Thread-Local Handshakes ThreadLocal握手交互

313: Remove the Native-Header Generation Tool (javah) 移除JDK中附带的javah工具

314: Additional Unicode Language-Tag Extensions 使用附加的Unicode语言标记扩展

316: Heap Allocation on Alternative Memory Devices 能将堆内存占用分配给用户指定的备用内存设备

317: Experimental Java-Based JIT Compiler 使用Graal基于Java的编译器

319: Root Certificates 根证书

322: Time-Based Release Versioning 基于时间定于的发布版本

jdk 11

https://openjdk.java.net/projects/jdk/11/

181: Nest-Based Access Control 基于嵌套的访问控制

309: Dynamic Class-File Constants 动态类文件常量

315: Improve Aarch64 Intrinsics 改进 Aarch64 Intrinsics

318: Epsilon: A No-Op Garbage Collector Epsilon — 一个No-Op(无操作)的垃圾收集器

320: Remove the Java EE and CORBA Modules 删除 Java EE 和 CORBA 模块

321: HTTP Client (Standard) HTTPClient API

323: Local-Variable Syntax for Lambda Parameters 用于 Lambda 参数的局部变量语法

324: Key Agreement with Curve25519 and Curve448 Curve25519 和 Curve448 算法的密钥协议

327: Unicode 10

328: Flight Recorder 飞行记录仪

329: ChaCha20 and Poly1305 Cryptographic Algorithms ChaCha20 和 Poly1305 加密算法

330: Launch Single-File Source-Code Programs 启动单一文件的源代码程序

331: Low-Overhead Heap Profiling 低开销的 Heap Profiling

332: Transport Layer Security (TLS) 1.3 支持 TLS 1.3

333: ZGC: A Scalable Low-Latency Garbage Collector(Experimental) 可伸缩低延迟垃圾收集器

335: Deprecate the Nashorn JavaScript Engine 弃用 Nashorn JavaScript 引擎

336: Deprecate the Pack200 Tools and API 弃用 Pack200 工具和 API

jdk 12

https://openjdk.java.net/projects/jdk/12/

189:Shenandoah: A Low-Pause-Time Garbage Collector (Experimental) 低暂停时间的GC

230: Microbenchmark Suite 微基准测试套件

325: Switch Expressions (Preview) switch表达式

334: JVM Constants API JVM常量API

340: One AArch64 Port, Not Two 只保留一个AArch64实现

341: Default CDS Archives 默认类数据共享归档文件

344: Abortable Mixed Collections for G1 可中止的G1 Mixed GC

346: Promptly Return Unused Committed Memory from G1 G1及时返回未使用的已分配内存

jdk 13

https://openjdk.java.net/projects/jdk/13/

350: Dynamic CDS Archives 动态CDS档案

351: ZGC: Uncommit Unused Memory ZGC:取消使用未使用的内存

353: Reimplement the Legacy Socket API 重新实现旧版套接字API

354: Switch Expressions (Preview) switch表达式(预览)

355: Text Blocks (Preview) 文本块(预览)

jdk 14

https://openjdk.java.net/projects/jdk/14/

305: Pattern Matching for instanceof (Preview) instanceof的模式匹配

343: Packaging Tool (Incubator) 打包工具

345: NUMA-Aware Memory Allocation for G1 G1的NUMA-Aware内存分配

349: JFR Event Streaming JFR事件流

352: Non-Volatile Mapped Byte Buffers 非易失性映射字节缓冲区

358: Helpful NullPointerExceptions 实用的NullPointerExceptions

359: Records (Preview)

361: Switch Expressions (Standard) Switch表达式

362: Deprecate the Solaris and SPARC Ports 弃用Solaris和SPARC端口

363: Remove the Concurrent Mark Sweep (CMS) Garbage Collector 删除并发标记扫描(CMS)垃圾回收器

364: ZGC on macOS

365: ZGC on Windows

366: Deprecate the ParallelScavenge + SerialOld GC Combination 弃用ParallelScavenge + SerialOld GC组合

367: Remove the Pack200 Tools and API 删除Pack200工具和API

368: Text Blocks (Second Preview) 文本块

370: Foreign-Memory Access API (Incubator) 外部存储器访问API

jdk 15

https://openjdk.java.net/projects/jdk/15/

339: Edwards-Curve Digital Signature Algorithm (EdDSA) EdDSA 数字签名算法

360: Sealed Classes (Preview) 密封类(预览)

371: Hidden Classes 隐藏类

372: Remove the Nashorn JavaScript Engine 移除 Nashorn JavaScript 引擎

373: Reimplement the Legacy DatagramSocket API 重新实现 Legacy DatagramSocket API

374: Disable and Deprecate Biased Locking 禁用偏向锁定

375: Pattern Matching for instanceof (Second Preview) instanceof 模式匹配(第二次预览)

377: ZGC: A Scalable Low-Latency Garbage Collector ZGC:一个可扩展的低延迟垃圾收集器

378: Text Blocks 文本块

379: Shenandoah: A Low-Pause-Time Garbage Collector Shenandoah:低暂停时间垃圾收集器

381: Remove the Solaris and SPARC Ports 移除 Solaris 和 SPARC 端口

383: Foreign-Memory Access API (Second Incubator) 外部存储器访问 API(第二次孵化版)

384: Records (Second Preview) Records(第二次预览)

385: Deprecate RMI Activation for Removal 废弃 RMI 激活机制

jdk 16

https://openjdk.java.net/projects/jdk/16/

338: Vector API (Incubator) Vector API(孵化器)

347: Enable C++14 Language Features JDK C++的源码中允许使用C++14的语言特性

357: Migrate from Mercurial to GitOpenJDK源码的版本控制从Mercurial (hg) 迁移到git

369: Migrate to GitHub OpenJDK源码的版本控制迁移到github上

376: ZGC: Concurrent Thread-Stack Processing ZGC:并发线程处理

380: Unix-Domain Socket Channels Unix域套接字通道

386: Alpine Linux Port 将glibc的jdk移植到使用musl的alpine linux上

387: Elastic Metaspace 弹性元空间

388: Windows/AArch64 Port 移植JDK到Windows/AArch64

389: Foreign Linker API (Incubator) 提供jdk.incubator.foreign来简化native code的调用

390: Warnings for Value-Based Classes 提供基于值的类的警告

392: Packaging Tool jpackage打包工具转正

393: Foreign-Memory Access API (Third Incubator)

394: Pattern Matching for instanceof Instanceof的模式匹配转正

395: Records Records转正

396: Strongly Encapsulate JDK Internals by Default 默认情况下,封装了JDK内部构件

397: Sealed Classes (Second Preview) 密封类

jdk 17

https://openjdk.java.net/projects/jdk/17/

306: Restore Always-Strict Floating-Point Semantics 恢复始终严格的浮点语义

356: Enhanced Pseudo-Random Number Generators 增强型伪随机数生成器

382: New macOS Rendering Pipeline 新的macOS渲染管道

391: macOS/AArch64 Port macOS/AArch64端口

398: Deprecate the Applet API for Removal 弃用Applet API后续将进行删除

403: Strongly Encapsulate JDK Internals 强封装JDK的内部API

406: Pattern Matching for switch (Preview) switch模式匹配(预览)

407: Remove RMI Activation 删除RMI激活机制

409: Sealed Classes 密封类转正

410: Remove the Experimental AOT and JIT Compiler 删除实验性的AOT和JIT编译器

411: Deprecate the Security Manager for Removal 弃用即将删除的安全管理器

412: Foreign Function & Memory API (Incubator) 外部函数和内存API(孵化特性)

414: Vector API (Second Incubator) Vector API(第二次孵化特性)

415: Context-Specific Deserialization Filters 上下文特定的反序列化过滤器

jdk 18

https://openjdk.org/projects/jdk/18/

400: UTF-8 by Default 默认为UTF-8

408: Simple Web Server 简单的Web服务器

413: Code Snippets in Java API Documentation Java API文档中的代码片段

416: Reimplement Core Reflection with Method Handles 用方法句柄重新实现核心反射

417: Vector API (Third Incubator) Vector API(第三个孵化器)

418: Internet-Address Resolution SPI internet地址解析SPI

419: Foreign Function & Memory API (Second Incubator) 外部函数与内存API(第二孵化器)

420: Pattern Matching for switch (Second Preview) 开关模式匹配(第二次预览)

421: Deprecate Finalization for Removal 不赞成删除最终化

jdk 19

https://openjdk.org/projects/jdk/19/

405: Record Patterns (Preview) 记录模式(预览)

422: Linux/RISC-V Port Linux / RISC-V端口

424: Foreign Function & Memory API (Preview) 外部函数和内存API(预览)

425: Virtual Threads (Preview) 虚拟线程(预览版)

426: Vector API (Fourth Incubator) Vector API(第四个孵化器)

427: Pattern Matching for switch (Third Preview) 开关模式匹配(第三次预览)

428: Structured Concurrency (Incubator) 结构化并发(孵化器)

jdk 20

https://openjdk.org/projects/jdk/20/

429: Scoped Values (Incubator) 范围值(孵化器)

432: Record Patterns (Second Preview) 记录模式(第二次预览)

433: Pattern Matching for switch (Fourth Preview) 开关模式匹配(第四次预览)

434: Foreign Function & Memory API (Second Preview) 外部函数和内存API(第二次预览)

436: Virtual Threads (Second Preview) 虚拟线程(第二次预览版)

437: Structured Concurrency (Second Incubator) 结构化并发(第二个孵化器)

438: Vector API (Fifth Incubator) 载体API(第五孵化器)

5. JDK各版本下载链接

https://www.oracle.com/java/technologies/downloads/archive/

6. 应该如何学习新特性

对于新特性,应该从哪几个角度学习新特性呢?

  • 语法层面:
  • 比如JDK5中的自动拆箱、自动装箱、enum、泛型
  • 比如JDK8中的lambda表达式、接口中的默认方法、静态方法
  • 比如JDK10中局部变量的类型推断
  • 比如JDK12中的switch
  • 比如JDK13中的文本块
  • API层面:
  • 比如JDK8中的StreamOptional、新的日期时间、HashMap的底层结构
  • 比如JDK9中String的底层结构
  • 新的 / 过时的 API
  • 底层优化
  • 比如JDK8中永久代被元空间替代、新的JS执行引擎
  • 比如新的垃圾回收器、GC参数、JVM的优化
相关文章
|
2月前
|
存储 安全 Java
Java Map新玩法:探索HashMap和TreeMap的高级特性,让你的代码更强大!
【10月更文挑战第17天】Java Map新玩法:探索HashMap和TreeMap的高级特性,让你的代码更强大!
78 2
|
2月前
|
存储 Java
深入探讨了Java集合框架中的HashSet和TreeSet,解析了两者在元素存储上的无序与有序特性。
【10月更文挑战第16天】本文深入探讨了Java集合框架中的HashSet和TreeSet,解析了两者在元素存储上的无序与有序特性。HashSet基于哈希表实现,添加元素时根据哈希值分布,遍历时顺序不可预测;而TreeSet利用红黑树结构,按自然顺序或自定义顺序存储元素,确保遍历时有序输出。文章还提供了示例代码,帮助读者更好地理解这两种集合类型的使用场景和内部机制。
46 3
|
2月前
|
存储 Java 数据处理
Java Set接口凭借其独特的“不重复”特性,在集合框架中占据重要地位
【10月更文挑战第16天】Java Set接口凭借其独特的“不重复”特性,在集合框架中占据重要地位。本文通过快速去重和高效查找两个案例,展示了Set如何简化数据处理流程,提升代码效率。使用HashSet可轻松实现数据去重,而contains方法则提供了快速查找的功能,彰显了Set在处理大量数据时的优势。
36 2
|
2月前
|
存储 算法 Java
Java Set因其“无重复”特性在集合框架中独树一帜
【10月更文挑战第14天】Java Set因其“无重复”特性在集合框架中独树一帜。本文深入解析Set接口及其主要实现类(如HashSet、TreeSet)如何通过特定的数据结构(哈希表、红黑树)确保元素唯一性,并提供最佳实践建议,包括选择合适的Set实现类和正确实现自定义对象的`hashCode()`与`equals()`方法。
36 3
|
10天前
|
存储 Java 开发者
什么是java的Compact Strings特性,什么情况下使用
Java 9引入了紧凑字符串特性,优化了字符串的内存使用。它通过将字符串从UTF-16字符数组改为字节数组存储,根据内容选择更节省内存的编码方式,通常能节省10%至15%的内存。
|
16天前
|
容器
jdk8新特性-详情查看文档
jdk8新特性-详情查看文档
35 7
|
19天前
|
存储 Java 数据挖掘
Java 8 新特性之 Stream API:函数式编程风格的数据处理范式
Java 8 引入的 Stream API 提供了一种新的数据处理方式,支持函数式编程风格,能够高效、简洁地处理集合数据,实现过滤、映射、聚合等操作。
35 6
|
1月前
|
分布式计算 Java API
Java 8引入了流处理和函数式编程两大新特性
Java 8引入了流处理和函数式编程两大新特性。流处理提供了一种声明式的数据处理方式,使代码更简洁易读;函数式编程通过Lambda表达式和函数式接口,简化了代码书写,提高了灵活性。此外,Java 8还引入了Optional类、新的日期时间API等,进一步增强了编程能力。这些新特性使开发者能够编写更高效、更清晰的代码。
33 4
|
1月前
|
Java Linux Windows
如何查看已安装的 Java 版本
要查看已安装的 Java 版本,打开命令提示符或终端,输入 `java -version`,回车后即可显示当前系统中 Java 的版本信息。
253 1
|
1月前
|
Ubuntu Java Linux
如何检查 Java 版本是否兼容
要检查Java版本是否兼容,可在命令行输入“java -version”查看当前安装的Java版本,然后对比目标应用所需的Java版本,确保其满足要求。
69 1