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的优化
相关文章
|
22天前
|
安全 Java 数据安全/隐私保护
|
22天前
|
搜索推荐 Java
Java的面向对象特性主要包括封装、继承和多态
【4月更文挑战第5天】Java的面向对象特性主要包括封装、继承和多态
15 3
|
1月前
|
人工智能 Java 编译器
Java 19的未来:新特性、性能优化和更多
Java 19的未来:新特性、性能优化和更多
|
1月前
|
Java API 数据处理
Java 8新特性之Stream API详解
【2月更文挑战第22天】本文将深入探讨Java 8中引入的Stream API,这是一种基于函数式编程的新特性,用于处理集合数据。我们将详细介绍Stream的基本概念、操作方法以及在实际开发中的应用,帮助读者更好地理解和使用这一强大的工具。
|
1月前
|
Java API
Java 8新特性之Lambda表达式与Stream API
【2月更文挑战第21天】本文将介绍Java 8中的两个重要特性:Lambda表达式和Stream API。Lambda表达式是Java 8中引入的一种新的编程语法,它允许我们将函数作为参数传递给方法,从而使代码更加简洁、易读。Stream API是一种用于处理集合的新API,它提供了一种高效且易于使用的处理数据的方式。本文将通过实例讲解这两个特性的基本用法以及它们如何帮助我们编写更简洁、高效的Java代码。
|
1天前
|
分布式计算 安全 Java
JAVA的三大版本
JAVA的三大版本
|
2天前
|
安全 Java 大数据
探索Java的奇妙世界:语言特性与实际应用
探索Java的奇妙世界:语言特性与实际应用
|
3天前
|
Java
【Java基础】详解面向对象特性(诸如继承、重载、重写等等)
【Java基础】详解面向对象特性(诸如继承、重载、重写等等)
8 0
|
9天前
|
机器学习/深度学习 Java API
Java8中的新特性
Java8中的新特性
|
10天前
|
Oracle Java 关系型数据库
Java 开发者必备:JDK 版本详解与选择策略(含安装与验证)
Oracle Java SE 支持路线图显示,JDK 8(LTS)支持至2030年,非LTS版本如9-11每6个月发布且支持有限。JDK 11(LTS)支持至2032年,而JDK 17及以上版本现在提供免费商用许可。LTS版本提供长达8年的支持,每2年发布一次。Oracle JDK与OpenJDK有多个社区和公司构建版本,如Adoptium、Amazon Corretto和Azul Zulu,它们在许可证、商业支持和更新方面有所不同。个人选择JDK时,可考虑稳定性、LTS、第三方兼容性和提供商支持。
24 0