不断更新的JDK版本及特性
1. JDK基本介绍
1.1. 长期版本及支持时间
LTS 版本,即 Long-term Support,意味着长期支持的版本。由 Oracle 官方确认的 LTS 版本可获得至少 8 年的产品支持,而非 LTS 版本的 JDK 只有 6 个月的产品支持。从Java9开始,计划发布周期为6个月;
JDK版本 | 开始时间 | 结束时间 | 延期结束日期 |
---|---|---|---|
JDK8 | 2014年3月 | 2022年3月 | 2030年12月 |
JDK11 | 2018年9月 | 2023年9月 | 2026年9月 |
JDK17 | 2021年9月 | 2026年9月 | 2029年9月 |
JDK21 | 2023年9月 | 2028年9月 | 2031年9月 |
JDK25 | 2025年9月 | 无 | 无 |
1.2. Oracle JDK和Open JDK
这两个JDK最大不同就是许可证不一样。但是对于个人用户来讲,没区别。
访问JDK地址: https://openjdk.org/projects/jdk/22/ 更改数字即可访问对应版本
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月起,所有版本免费 |
2. JDK特性
2.1. JDK23(收集中-2024年9月)
收集中
2.2. JDK22(12特性-2024年3月)
423: | Region Pinning for G1 | G1 的区域固定 |
447: | Statements before super(...) (Preview) | super(...) 之前的语句(预览) |
454: | Foreign Function & Memory API | 外部函数和内存 API |
456: | Unnamed Variables & Patterns | 未命名变量和模式 |
457: | Class-File API (Preview) | 类文件 API(预览版) |
458: | Launch Multi-File Source-Code Programs | 启动多文件源代码程序 |
459: | String Templates (Second Preview) | 字符串模板(第二次预览) |
460: | Vector API (Seventh Incubator) | Vector API(第七个孵化器) |
461: | Stream Gatherers (Preview) | 流收集器(预览) |
462: | Structured Concurrency (Second Preview) | 结构化并发(第二预览版) |
463: | Implicitly Declared Classes and Instance Main Methods (Second Preview) | 隐式声明的类和实例主要方法(第二预览版) |
464: | Scoped Values (Second Preview) | 范围值(第二次预览版) |
2.3. JDK21(15特性-2023年9月)
- 序列集合。该 JEP 提议引入“一个新的接口族,用于表示集合的概念,这些集合的元素按照预定义的序列或顺序排列,它们是作为集合的结构属性。”这一提案的动机是由于集合框架中缺乏预定义的顺序和统一的操作集。
- 分代 ZGC。通过扩展Z垃圾回收器(ZGC)来维护年轻对象和年老对象的独立生成,从而提高应用程序性能。这将使ZGC能够更频繁地收集年轻对象——这些对象往往英年早逝。
- 记录模式。使用记录模式(Record Patterns)增强Java编程语言,以解构记录值。可以嵌套记录模式和类型模式,以实现功能强大、声明性和可组合形式的数据导航和处理。
- switch 模式匹配。通过switch表达式和语句的模式匹配来增强Java编程语言。通过将模式匹配扩展到switch,可以针对多个模式测试表达式,每个模式都有一个特定的操作,从而可以简洁、安全地表达复杂的面向数据的查询。
- 虚拟线程。将虚拟线程(Virtual Threads)引入Java平台。虚拟线程是轻量级线程,可以显著减少编写、维护和观察高吞吐量并发应用程序的工作量。
- 弃用Windows 32位x86移植,并打算在将来的版本中将其删除。
- 准备禁止动态加载代理。将代理动态加载到正在运行的JVM中时发出警告。这些警告旨在让用户为将来的版本做好准备,该版本默认情况下不允许动态加载代理,以提高默认情况下的完整性。在启动时加载代理的可服务性工具不会导致在任何版本中发出警告。
- 密钥封装机制 API。介绍一种用于密钥封装机制(Key Encapsulation Mechanism,简称KEM)的API,这是一种使用公钥加密来保护对称密钥的加密技术。
- 字符串模板(预览)。使用字符串模板(String Templates)增强Java编程语言。字符串模板通过将文本与嵌入的表达式和模板处理器耦合来生成专门的结果,从而补充Java现有的字符串文本和文本块。这是一个预览语言功能和API。
- 外部函数和内存 API(第三次预览)。引入API,Java程序可以通过该API与Java运行时之外的代码和数据进行互操作。通过有效地调用外部函数(即JVM外部的代码),并通过安全地访问外部内存(即不受JVM管理的内存),API使Java程序能够调用本机库并处理本机数据,而不会出现JNI的脆弱性和危险性。这是一个预览API。
- 未命名模式和变量(预览)。使用未命名模式和未命名变量来增强Java语言,未命名模式匹配记录组件而不说明组件的名称或类型,未命名变量可以初始化但不使用。两者都用下划线字符_表示。这是一个预览语言功能。
- 未命名类和实例主方法(预览)。发展Java语言,使学生无需理解为大型程序设计的语言功能即可编写第一个程序。学生们不用使用单独的Java方言,就可以为单类程序编写精简的声明,然后随着技能的发展,无缝地扩展程序,使用更高级的功能。这是一个预览语言功能。
- 作用域值(预览)。引入作用域值,这些值可以在不使用方法参数的情况下安全有效地共享给方法。它们优先于线程化局部变量,尤其是在使用大量虚拟线程时。这是一个预览API。
- 结构化并发(预览)。通过引入用于结构化并发(Structured Concurrency)的API来简化并发编程。结构化并发将在不同线程中运行的相关任务组视为单个工作单元,从而简化错误处理和消除,提高可靠性,并增强可观察性。这是一个预览API。
- Vector API(孵化器第六阶段)
430: | String Templates (Preview) | 字符串模板(预览) |
431: | Sequenced Collections | 有序集合 |
439: | Generational ZGC | 世代ZGC |
440: | Record Patterns | 记录模式 |
441: | Pattern Matching for switch | 开关的模式匹配 |
442: | Foreign Function & Memory API (Third Preview) | 外部函数和内存 API(第三次预览版) |
443: | Unnamed Patterns and Variables (Preview) | 未命名模式和变量(预览) |
444: | Virtual Threads | 虚拟线程 |
445: | Unnamed Classes and Instance Main Methods (Preview) | 未命名类和实例主要方法(预览) |
446: | Scoped Values (Preview) | 范围值(预览) |
448: | Vector API (Sixth Incubator) | Vector API(第六个孵化器) |
449: | Deprecate the Windows 32-bit x86 Port for Removal | 弃用 Windows 32 位 x86 端口以进行删除 |
451: | Prepare to Disallow the Dynamic Loading of Agents | 准备禁止动态加载代理 |
452: | Key Encapsulation Mechanism API | 密钥封装机制API |
453: | Structured Concurrency (Preview) | 结构化并发(预览版) |
2.4. JDK20(7特性-2023年3月)
- 作用域值(孵化器)
- Record 模式匹配(第二次预览)
- switch 的模式匹配(第四次预览)
- 外部函数和内存 API(第二个预览版)
- 虚拟线程(第二个预览版)
- 结构化并发(第二孵化器)
- Vector API(第五孵化器)
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) | Vector API(第五孵化器) |
2.5. JDK19(7特性-2022年10月)
- 结构化并发。当前还处于孵化阶段,旨在通过结构化并发 API 简化多线程编程。这种并发性将不同线程中运行的多个任务视为单个工作单元,从而简化错误处理、提高可靠性和可观察性。这个功能来自 Project Loom,它引入了一个新的轻量级并发模型。
- 记录模式,这一功能目前也处于预览版,主要是用来解构记录值。记录模式和类型模式可以被嵌套,以实现强大的、具有声明性的和可组合的数据导航和处理形式。该提案的目标包括扩展模式匹配,用以表达更复杂的、可组合的数据查询,同时不改变类型模式的语法或语义。该提案建立在 2021 年 3 月在 JDK 16 中交付的模式匹配的基础上。未来,Oracle 可能会要求对记录模式进行扩展,使之具备数组模式、Vararg 模式。记录模式是 Project Amber 的一部分,该项目旨在探索和孵化较小的、面向生产力的 Java 功能。
- 外部函数和内存 API 的预览版。通过引入一个 API,Java 程序可以与 Java 运行时之外的代码和数据进行互操作。通过有效地调用外部函数(即 JVM 之外的代码)和安全地访问外部内存(即不由 JVM 管理的内存),该 API 使 Java 程序能够调用本地库并处理本机数据,而不会出现 Java 本地接口(JNI)的危险和脆弱。外部函数和内存 API 结合了两个早期的孵化 API:外部内存访问 API 和外部链接器 API。外部函数和内存 API 曾在 JDK 17 中孵化,而后在 JDK 18 中重新孵化。该提案的目标包括易用性、性能、通用性和安全性。
- 虚拟线程的预览版。这是一种轻量级的线程,大大减少了编写、维护和观察高吞吐量并发应用的工作量。可以以简单的 thread-per-request 风格编写的服务器应用程序能够以接近最佳的硬件利用率进行扩展,通过使用 java.lang Thread API 现有代码能够以最小的改动采用虚拟线程,并基于现有的 JDK 工具对虚拟线程进行故障诊断、调试和分析。本提案的目标不是要改变 Java 的基本并发模型,也不是要在 Java 语言或 Java 库中提供新的数据并行结构。它的目标也不是去除线程的传统实现,或默默地将现有的应用程序迁移到使用虚拟线程。这项功能也是 Project Loom 的一部分。
- 对 switch 表达式和语句的模式匹配进行了第三次预览。这项功能以前在 JDK 17、JDK 18 中进行过预览。这一次在 JDK 19 中将进一步细化功能,包括用 switch 块中的 when 子句替换受保护的模式。另外,当选择器表达式的值为 null 时,模式切换的运行时语义与传统的语义更加一致。这项功能也是 Amber 项目的一部分。
- Vector API 的第四次孵化,将表达向量计算,在运行时可靠地编译为支持的 CPU 架构上的最佳向量指令,从而实现优于等效标量计算的性能。该 API 的开发者使用 HotSpot 自动矢量器,可获得了一种在 Java 中编写复杂的向量算法的方法,但有一个用户模型,使向量化更可预测和稳健。Vector API 先前已被纳入 JDK 16、JDK 17 和 JDK 19。在最新的 JDK 19 中,官方为该功能增加了两个跨道向量操作,即压缩和扩展,以及一个互补的向量掩码压缩操作。压缩向量操作将由掩码选择的源向量的通道按通道顺序映射到目标向量,而扩展操作则做相反的操作。压缩操作在过滤查询结果时非常有用。
- 通过 Linux/RISC-V 移植,目前这一功能已正式可用。Java 将获得对硬件指令集的支持,该指令集已经被广泛的语言工具链所支持。RISC-V 实际上是一系列相关的 ISA。Linux/RISC-V 端口将只支持 RISC-V 的 RV64GV 配置,这是一个包括矢量指令的通用 64 位 ISA。Java 的开发者可能会在将来考虑其他 RISC-V 的配置。
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) | 结构化并发(孵化器) |
2.6. JDK18(9特性-2022年3月)
- 指定 UTF-8 作为标准 Java API 的默认字符集。通过此更改,依赖于默认字符集的 API 将在所有实现、操作系统、区域设置和配置中保持一致。
- 引入一个简单的 Web 服务器。提供一个命令行工具,来启动一个只提供静态文件的最小网络服务器,它没有 CGI 或类似 servlet 的功能可用。该工具用于原型设计、临时编码和测试目的,尤其是在教学环境中。
- 支持在 Java API 文档中加入代码片段。为 JavaDoc 的 Standard Doclet 引入一个 @snippet 标记,以简化 API 文档中嵌入示例源代码的难度。
- 用方法句柄重新实现核心反射。在 java.lang.invoke 的方法句柄之上,重构 java.lang.reflect 的方法、构造函数和字段,使用方法句柄处理反射的底层机制将减少 java.lang.reflect 和 java.lang.invoke 两者的 API 维护和开发成本。
- Vector API(第三孵化器)。引入一个 API 来表达向量计算,这些计算在运行时可以编译为支持的 CPU 架构上的最佳向量指令,从而实现优于等效标量计算的性能。
- 互联网地址解析 SPI。定义用于主机名和地址解析的服务提供者接口 (SPI),以便java.net.InetAddress可以使用平台内置解析器以外的解析器。
- 外部函数和内存 API(第二孵化器)。引入了一个新 API, Java 程序可以通过它与 Java 运行时之外的代码和数据进行互操作。通过有效地调用外部函数(即 JVM 外的代码),并安全地访问外部内存(即不由 JVM 管理的内存),外部函数和内存 API 使 Java 程序能够调用本机库并处理本机数据,而不具有 JNI 的脆弱性和危险。
- switch 模式匹配表达式。使用 switch 表达式和语句的模式匹配以及对模式语言的扩展来增强 Java 编程语言。将模式匹配扩展到 switch 允许针对多个模式测试表达式,每个模式都有特定的操作,可以简洁安全地表达复杂的面向数据的查询。
- 弃用 Finalization 功能。Java 1.0 中引入的 Finalization 旨在帮助避免资源泄漏问题,然而这个功能存在延迟不可预测、行为不受约束,以及线程无法指定等缺陷,导致其安全性、性能、可靠性和可维护性方面都存在问题,因此将其弃用,用户可选择迁移到其他资源管理技术,例如try-with-resources 语句和清洁器。
400: | UTF-8 by Default | 默认 UTF-8 |
408: | Simple Web Server | 简单的网络服务器 |
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 | 联网地址解析 SPI |
419: | Foreign Function & Memory API (Second Incubator) | 外部函数和内存 API(第二个孵化器) |
420: | Pattern Matching for switch (Second Preview) | 开关的模式匹配(第二次预览) |
421: | Deprecate Finalization for Removal | 弃用最终确定删除 |
2.7. JDK17(14特性-2021年9月)
- Free Java License 根据Oracle官方发布的最新Free Java License,Oracle JDK 可以免费用于生产环境。
- JDK 17 将取代 JDK 11 成为下一个长期支持版本
- Spring 6 和 Spring Boot 3需要JDK17
- 移除实验性的 AOT 和 JIT 编译器
- 恢复始终执行严格模式 (Always-Strict) 的浮点定义
- 正式引入密封类sealed class,限制抽象类的实现
- 统一日志异步刷新,先将日志写入缓存,然后再异步刷新
- 虽然JDK17也是一个LTS版本,但是并没有像JDK8和JDK11一样引入比较突出的特性,主要是对前几个版本的整合和完善。
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 | 强封装]DK内部 |
406: | Pattern Matching for switch (Preview) | 开关模式匹配(预览) |
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 | 上下文特定的反序列化过滤器 |
2.8. JDK16(17特性-2021年3月)
- 允许在 JDK C ++源代码中使用 C ++ 14功能
- ZGC性能优化,去掉ZGC线程堆栈处理从安全点到并发阶段
- 增加 Unix 域套接字通道
- 弹性元空间能力
- 提供用于打包独立 Java 应用程序的 jpackage 工具
- JDK16相当于是将JDK14、JDK15的一些特性进行了正式引入,如instanceof模式匹配(Pattern matching)、record的引入等最终到JDK16变成了final版本。
338: | Vector API (Incubator) | 矢量 API(孵化器) |
347: | Enable C++14 Language Features | 启用 C++14 语言功能 |
357: | Migrate from Mercurial to Git | 从 Mercurial 迁移到 Git |
369: | Migrate to GitHub | 迁移到 GitHub |
376: | ZGC: Concurrent Thread-Stack Processing | ZGC:并发线程堆栈处理 |
380: | Unix-Domain Socket Channels | Unix 域套接字通道 |
386: | Alpine Linux Port | Alpine Linux 端口 |
387: | Elastic Metaspace | 弹性元空间 |
388: | Windows/AArch64 Port | Windows/AArch64 端口 |
389: | Foreign Linker API (Incubator) | 外部链接器 API(孵化器) |
390: | Warnings for Value-Based Classes | 基于值的类的警告 |
392: | Packaging Tool | 包装工具 |
393: | Foreign-Memory Access API (Third Incubator) | 外部内存访问 API(第三个孵化器) |
394: | Pattern Matching for instanceof | instanceof 的模式匹配 |
395: | Records | 记录 |
396: | Strongly Encapsulate JDK Internals by Default | 默认情况下强封装JDK内部 |
397: | Sealed Classes (Second Preview) | 密封类(第二次预览) |
2.9. JDK15(14特性-2020年9月)
- EdDSA 数字签名算法
- Sealed Classes(封闭类,预览),通过sealed关键字修饰抽象类限定只允许指定的子类才可以实现或继承抽象类,避免抽象类被滥用
- Hidden Classes(隐藏类)
- 移除 Nashorn JavaScript引擎
- 改进java.net.DatagramSocket 和 java.net.MulticastSocket底层实现
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激活机制 |
2.10. JDK14(16特性-2020年3月)
- instanceof模式匹配,instanceof类型匹配语法简化,可以直接给对象赋值,如if(obj instanceof String str),如果obj是字符串类型则直接赋值给了str变量
- 引入Record类型,类似于Lombok 的@Data注解,可以向Lombok一样自动生成构造器、equals、getter等方法;
- Switch 表达式-标准化
- 改进 NullPointerExceptions提示信息,打印具体哪个方法抛的空指针异常,避免同一行代码多个函数调用时无法判断具体是哪个函数抛异常的困扰,方便异常排查;
- 删除 CMS 垃圾回收器
305: | Pattern Matching for instanceof (Preview) | instanceof 的模式匹配(预览版) |
343: | Packaging Tool (Incubator) | 打包工具(孵化器) |
345: | NUMA-Aware Memory Allocation for G1 | G1 的 NUMA 感知内存分配 |
349: | JFR Event Streaming | JFR 事件流 |
352: | Non-Volatile Mapped Byte Buffers | 非易失性映射字节缓冲区 |
358: | Helpful NullPointerExceptions | 有用的空指针异常 |
359: | Records (Preview) | 记录(预览) |
361: | Switch Expressions (Standard) | 开关表达式(标准) |
362: | Deprecate the Solaris and SPARC Ports | 弃用 Solaris 和 SPARC 端口 |
363: | Remove the Concurrent Mark Sweep (CMS) Garbage Collector | 删除并发标记清除 (CMS) 垃圾收集器 |
364: | ZGC on macOS | macOS 上的 ZGC |
365: | ZGC on Windows | Windows 上的 ZGC |
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(孵化器) |
2.11. JDK13(5特性-2019年9月)
- Switch 表达式扩展,switch表达式增加yield关键字用于返回结果,作用类似于return,如果没有返回结果则使用break
- 文本块升级 “”" ,引入了文本块,可以使用"""三个双引号表示文本块,文本块内部就不需要使用换行的转义字符
- SocketAPI 重构,Socket的底层实现优化,引入了NIO
- FileSystems.newFileSystem新方法
- ZGC优化,增强 ZGC 释放未使用内存,将标记长时间空闲的堆内存空间返还给操作系统,保证堆大小不会小于配置的最小堆内存大小,如果堆最大和最小内存大小设置一样,则不会释放内存还给操作系统
350: | Dynamic CDS Archives | 动态 CDS 档案 |
351: | ZGC: Uncommit Unused Memory | ZGC:取消提交未使用的内存 |
353: | Reimplement the Legacy Socket API | 重新实现旧版套接字 API |
354: | Switch Expressions (Preview) | 开关表达式(预览) |
355: | Text Blocks (Preview) | 文本块(预览) |
2.12. JDK12(8特性-2019年3月)
- Switch 表达式扩展,可以有返回值
- 新增NumberFormat对复杂数字的格式化
- 字符串支持transform、indent操作
- 新增方法Files.mismatch(Path, Path)
- Teeing Collector
- 支持unicode 11
- Shenandoah GC,新增的GC算法
- G1收集器的优化,将GC的垃圾分为强制部分和可选部分,强制部分会被回收,可选部分可能不会被回收,提高GC的效率
189: | Shenandoah: A Low-Pause-Time Garbage Collector (Experimental) | Shenandoah:低暂停时间垃圾收集器(实验性) |
230: | Microbenchmark Suite | 微基准测试套件 |
325: | Switch Expressions (Preview) | 开关表达式(预览) |
334: | JVM Constants API | JVM 常量 API |
340: | One AArch64 Port, Not Two | 一个 AArch64 端口,而不是两个 |
341: | Default CDS Archives | 默认 CDS 档案 |
344: | Abortable Mixed Collections for G1 | G1 可混合集合 |
346: | Promptly Return Unused Committed Memory from G1 | 立即从 G1 返回未使用的提交内存 |
2.13. JDK11(17特性-2018年9月)
- 增加一些字符串处理方法
- 用于 Lambda 参数的局部变量语法
- Http Client重写,支持HTTP/1.1和HTTP/2 ,也支持 websockets
- 可运行单一Java源码文件,如:java Test.java
- ZGC:可伸缩低延迟垃圾收集器,ZGC可以看做是G1之上更细粒度的内存管理策略。由于内存的不断分配回收会产生大量的内存碎片空间,因此需要整理策略防止内存空间碎片化,在整理期间需要将对于内存引用的线程逻辑暂停,这个过程被称为"Stop the world"。只有当整理完成后,线程逻辑才可以继续运行。(并行回收)
- 支持 TLS 1.3 协议
- Flight Recorder(飞行记录器),基于OS、JVM和JDK的事件产生的数据收集框架
- 对Stream、Optional、集合API进行增强
181: | Nest-Based Access Control | 基于嵌套的访问控制 |
309: | Dynamic Class-File Constants | 动态类文件常量 |
315: | Improve Aarch64 Intrinsics | 改进 Aarch64内在函数 |
318: | Epsilon: A No-Op Garbage Collector | Epsilon:无操作垃圾收集器 |
320: | Remove the Java EE and CORBA Modules | 删除 Java EE 和 CORBA 模块 |
321: | HTTP Client (Standard) | HTTP 客户端(标准) |
323: | Local-Variable Syntax for Lambda Parameters | 本地变量Lambda 参数的语法 |
324: | Key Agreement with Curve25519 and Curve448 | 与 Curve25519 和 Curve448 的密钥协议 |
327: | Unicode 10 | 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 | 低开销堆分析 |
332: | Transport Layer Security (TLS) 1.3 | 传输层安全性 (TLS) 1.3 |
333: | ZGC: A Scalable Low-Latency Garbage Collector(Experimental) | ZGC:可扩展的低延迟垃圾收集器(实验性) |
335: | Deprecate the Nashorn JavaScript Engine | 弃用 Nashorn JavaScript 引擎 |
336: | Deprecate the Pack200 Tools and API | 弃用 Pack200 工具和 API |
2.14. JDK10(12特性-2018年3月)
- 局部变量类型推断,类似JS可以通过var来修饰局部变量,编译之后会推断出值的真实类型
- 不可变集合的改进
- 并行全垃圾回收器 G1,来优化G1的延迟
- 线程本地握手,允许在不执行全局VM安全点的情况下执行线程回调,可以停止单个线程,而不需要停止所有线程或不停止线程
- Optional新增orElseThrow()方法
- 类数据共享
- Unicode 语言标签扩展
- 根证书
2.15. JDK9(91特性-2017年9月)
Java 9 提供了超过150项新功能特性,包括备受期待的模块化系统、可交互的 REPL 工具:jshell,JDK 编译工具,Java 公共 API 和私有代码,以及安全增强、扩展提升、性能管理改善等。
- 模块化
- 提供了List.of()、Set.of()、Map.of()和Map.ofEntries()等工厂方法
- 接口支持私有方法
- Optional 类改进
- 多版本兼容Jar包
- JShell工具
- try-with-resources的改进
- Stream API的改进
- 设置G1为JVM默认垃圾收集器
- 支持http2.0和websocket的API
2.16. JDK8(10特性-2014年3月)
- Lambda表达式
- 新的日期API
- 引入Optional
- 使用Base64
- 接口的默认方法和静态方法
- 新增方法引用格式
- 新增Stream类
- 注解相关的改变
- 支持并行(parallel)数组
- 对并发类(Concurrency)的扩展。