java21学习笔记
JDK 20于 2023 年 3 月 21 日发布,Java10之后规定的每半年发布一版
这个版本最大特征是虚拟线程上线了,极大的改良了多线性程的性能。
430: | String Templates (Preview) |
431: | Sequenced Collections |
439: | Generational ZGC |
440: | Record Patterns |
441: | Pattern Matching for switch |
442: | Foreign Function & Memory API (Third Preview) |
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) |
449: | Deprecate the Windows 32-bit x86 Port for Removal |
451: | Prepare to Disallow the Dynamic Loading of Agents |
452: | Key Encapsulation Mechanism API |
453: | Structured Concurrency (Preview) |
JEP 430: String Templates (Preview)
使用字符串模板增强 Java 编程语言。字符串模板通过将文字文本与嵌入式表达式和模板处理器耦合以产生专门的结果,补充了 Java 现有的字符串文字和文本块。这是一个预览语言功能和 API。
详情可以参阅文章 学习笔记-字符串模板
JEP 431: Sequenced Collections
引入新的接口来表示具有定义的相遇顺序的集合。每个这样的集合都有一个明确定义的第一个元素、第二个元素,依此类推,直到最后一个元素。它还提供统一的 API 来访问其第一个和最后一个元素,并以相反的顺序处理其元素。
详情可以参阅文章 java21学习笔记-序列集合
JEP 439: Generational ZGC
通过扩展 Z 垃圾收集器 (ZGC) 来维护新对象和旧对象的单独代 ,从而提高应用程序性能。这将使 ZGC 能够更频繁地收集年轻的物体——这些物体往往会英年早逝。
ZGC (JEP 333) 专为低延迟和高可扩展性而设计。它自 JDK 15 (JEP 377) 以来一直可用于生产。
ZGC 在应用程序线程运行时完成大部分工作,仅短暂暂停这些线程。ZGC 的暂停时间始终以微秒为单位;相比之下,默认垃圾回收器 G1 的暂停时间从毫秒到几秒不等。ZGC 的低暂停时间与堆大小无关:工作负载可以使用从几百兆字节一直到几 TB 的堆大小,并且仍然享受低暂停时间。
对于许多工作负载来说,只需使用 ZGC 就足以解决与垃圾回收相关的所有延迟问题。只要有足够的资源(即内存和 CPU)可用,以确保 ZGC 可以比并发运行的应用程序线程消耗内存更快地回收内存,这就可以正常工作。但是,ZGC 目前将所有对象存储在一起,无论年龄如何,因此每次运行时都必须收集所有对象。
弱代际假说指出,年轻的物体往往会英年早逝,而旧的物体往往会留下来。因此,收集年轻对象需要更少的资源并产生更多的内存,而收集旧对象需要更多的资源并产生更少的内存。因此,我们可以通过更频繁地收集年轻对象来提高使用 ZGC 的应用程序的性能。
为确保顺利继承,我们将首先将分代 ZGC 与非分代 ZGC 一起提供。-XX:+UseZGC
命令行选项将选择非分代 ZGC;要选择“分代 ZGC”,请添加 -XX:+ZGenerational
选项:
$ java -XX:+UseZGC -XX:+ZGenerational ...
在未来的版本中,我们打算将 Generational ZGC 设为默认值,此时 -XX:-ZGenerational
将选择非分代 ZGC。在更晚的版本中,我们打算删除非分代 ZGC,此时 ZGenerational
选项将过时。
JEP 440: Record Patterns
使用记录模式增强 Java 编程语言,以解构记录值。可以嵌套记录模式和类型模式,以实现强大的、声明性的和可组合的数据导航和处理形式。
详情可以参阅文章 学习笔记-Record类
JEP 441: Pattern Matching for switch
通过开关
的模式匹配增强 Java 编程语言 表达式和语句。将模式匹配扩展到 switch
,允许针对多个模式测试表达式,每个模式都有特定的作,以便可以简洁、安全地表达复杂的面向数据的查询。
详情可以参阅文章 java学习笔记-switch总结
JEP 442: Foreign Function & Memory API (Third Preview)
引入一个 API,Java 程序可以通过该 API 与 Java 运行时之外的代码和数据进行互作。通过有效地调用外部函数(即 JVM 外部的代码)以及安全地访问外部内存(即不受 JVM 管理的内存),API 使 Java 程序能够调用本机库并处理本机数据,而没有 JNI 的脆性和危险性。这是一个预览 API。
详情可以参阅文章 java学习笔记-Foreign-Memory Access API外部内存APIjava学习笔记-Foreign-Memory Access API外部内存API
JEP 443: Unnamed Patterns and Variables (Preview)
使用未命名模式 (与记录组件匹配而不说明组件的名称或类型)和未命名变量 (可以初始化但不能使用)来增强 Java 语言。两者都用下划线字符 _
表示。这是一项预览语言功能 。
JEP 444: Virtual Threads
将虚拟线程引入 Java 平台。虚拟线程是轻量级线程,可显著减少编写、维护和观察高吞吐量并发应用程序的工作量。
详情可以参阅文章 学习笔记-Virtual Threads虚拟线程
JEP 445: Unnamed Classes and Instance Main Methods (Preview)
发展 Java 语言,使学生无需了解为大型程序设计的语言功能即可编写他们的第一个程序。学生远没有使用单独的 Java 方言,而是可以为单类程序编写简化的声明,然后随着技能的增长无缝扩展他们的程序以使用更高级的功能。这是一项预览语言功能 。
String greeting = "Hello, World!";String greeting() { return "Hello, World!"; }void main() {System.out.println(greeting);System.out.println(greeting());new Object() {public void main() {System.out.println("Hello, anonymous class!");}}.main();}
如上所示:main方法更加简化
类声明和强制
公共
访问修饰符是大型编程结构。当封装具有与外部组件的明确定义接口的代码单元时,它们很有用,但在这个小示例中毫无意义。
String[] args
参数也存在,用于将代码与外部组件(在本例中为作系统的 shell)连接。它在这里是神秘且无益的,特别是因为它从未被使用过。
静态
修饰符是 Java 类和对象模型的一部分。对于新手来说,static
不仅神秘而且有害:要添加更多main
可以调用和使用的方法或字段,学生必须要么将它们全部声明为static
——从而传播一个既不常见也不是一个好习惯的习语——要么面对 static 和 instance 成员之间的区别,并学习如何实例化一个对象。mian方法可以调用其他普通成员而非静态成员
后续还有好几个预览版本,而且内容也相差很大
JEP 446: Scoped Values (Preview)
引入作用域值 ,这些值可以在不使用方法参数的情况下安全有效地共享给方法。它们比线程局部变量更受欢迎,尤其是在使用大量虚拟线程时。这是一个预览 API。
详情可以参阅文章 学习笔记-作用域值
JEP 448: Vector API (Sixth Incubator)
引入一个 API 来表达矢量计算,这些计算在运行时可靠地编译为受支持的 CPU 架构上的最佳矢量指令,从而实现优于等效标量计算的性能。
详情可以参阅文章 java学习笔记-Vector API
JEP 449: Deprecate the Windows 32-bit x86 Port for Removal
弃用 Windows 32 位 x86 端口,打算在将来的版本中将其删除。
允许 OpenJDK 社区中的贡献者加速开发新功能和增强功能,以推动平台向前发展。
适用于 Windows x86-32 的 JEP 436(虚拟线程) 的实现回退到使用内核线程,因此不会带来 Project Loom 的预期好处。
Windows 10 是最后一个支持 32 位作的 Windows 作系统,将于 2025 年 10 月终止生命周期。
JEP 451: Prepare to Disallow the Dynamic Loading of Agents
当代理动态加载到正在运行的 JVM 中时发出警告。这些警告旨在让用户为未来的版本做好准备,该版本默认不允许动态加载代理,以提高默认情况下的完整性 。在启动时装入代理程序的可维护性工具不会导致在任何发行版中发出警告
JEP 452: Key Encapsulation Mechanism API
引入密钥封装机制 (KEM) 的 API,这是一种使用公钥加密技术保护对称密钥的加密技术。
JEP 453: Structured Concurrency (Preview)
通过引入结构化并发 API 来简化并发编程。结构化并发将不同线程中运行的相关任务组视为单个工作单元,从而简化错误处理和取消,提高可靠性并增强可观测性。这是一个预览 API。