JDK 20新特性简介
按照JDK每半年发布一次版本的节奏, JDK20在2023年3月发布了, 本文就是简单介绍一下这次更新的新特性与改动.
一句话总结, 这仍然是jdk的一个短期支持版本,此版本包括7个 JEP(jdk增强建议),以及数百个较小的功能增强和数千个错误修复.
新特性汇总
预览特性
语言特性:
- JEP 432 Record Patterns(记录模式) : 第2预览阶段. 记录模式是java语言的一个新语言特性.其目的是将我们从java复杂的类构造中解放出来,更关注于数据. 一般用于一组数据构成的一个整体,比如坐标point(x,y).
- JEP 433 Pattern Matching for switch(switch记录模式):第4次预览, switch语法支持记录模式.
API库扩充:
- JEP 434 Foreign Function &Memory AP(访问jvm外部函数或内存的API) : 引入一个API,通过该API,Java程序可以在Java运行时之外与代码和数据进行互操作。通过有效地调用外部函数(即JVM外部的代码),并通过安全访问外部内存(即不由JVM管理的内存),API使Java程序能够调用本机库并处理本机数据,而没有JNI的脆性和危险性。
- JEP 438 Vector API(向量API): 第5孵化阶段.向量计算由对向量的一系列操作组成。向量 API 用来表达向量计算,该计算可以在运行时可靠地编译为支持的 CPU 架构上的最佳向量指令,从而实现优于等效标量计算的性能。向量 API 的目标是为用户提供简洁易用且与平台无关的表达范围广泛的向量计算.
并发增强:
- JEP 429 Scoped Values(作用域值) : 孵化阶段.引入范围值,允许在线程内和线程之间共享不可变的数据。它们优于线程本地变量,特别是在使用大量虚拟线程时。因为变量是不可变的,也就避免了并发问题.
- JEP 436 Virtual Threads(虚拟线程) : 第2预览阶段. 将虚拟线程引入Java平台。虚拟线程是轻量级线程,大大减少了编写、维护和观察高吞吐量并发应用程序的工作量. 本次主要是一些核心功能升级.
- JEP 437 Structured Concurrency(结构化并发) : 第2孵化阶段. 通过引入结构化并发的API来简化多线程编程。结构化并发将在不同线程中运行的多个任务视为单个工作单元,从而简化错误处理和取消,提高可靠性并提高可观察性。
主要特性
核心库
- Support Unicode 15.0 (JDK-8284842) : 支持Unicode15.0 .
- Print Warning to Standard Error If Bad java.io.tmpdir Setting Is Detected (JDK-8290313) : 新增一种警告输出场景
安全
- New JFR Event: jdk.InitialSecurityProperty (JDK-8292177) : 新增一个新的JFR(Java Flight Recorder)事件.
- New JFR Event: jdk.SecurityProviderService (JDK-8254711) : 新增一个新的JFR(Java Flight Recorder)事件.
- Provide Poly1305 Intrinsic on x86_64 platforms with AVX512 instructions (JDK-8288047) : 此功能在x86_64平台上使用AVX512指令为SunJCE提供商的Poly1305消息身份验证代码算法提供优化。
- Provide ChaCha20 Intrinsics on x86_64 and aarch64 Platforms (JDK-8247645) : 此功能为SunJCE提供商提供的ChaCha20密码提供了优化的内在实现。这些优化的例程专为支持AVX、AVX2和/或AVX512指令集的x86_64芯片组以及支持高级SIMD指令集的aarch64芯片组而设计。
- (D)TLS Key Exchange Named Groups (JDK-8281236) : 加密功能增强.
- DTLS Resumption Uses HelloVerifyRequest Messages (JDK-8287411) : 加密功能增强.
工具
- Javac Warns about Type Casts in Compound Assignments with Possible Lossy Conversions(JDK-8244681) : javac命令增加了有损类型强转警告.
- New ‘jmod –compress’ Command Line Option(JDK-8293499) : 在jmod工具中添加了一个新的–compress命令行选项,以便在创建JMOD存档时指定压缩级别。接受的值是zip-[0-9],其中zip-0不提供压缩,zip-9提供最佳压缩。默认是zip-6。
jdk20 工具箱全集
虚拟机
- add bean for Remark and Cleanup Pause Time in G1 (JDK-8297247) : G1垃圾回收在标记和清理阶段引入了一个新的回收bean : “G1 Concurrent GC”
移出功能
- Thread.suspend/resume Changed to Throw UnsupportedOperationException (JDK-8249627) : 在此版本中,使用Thread.suspend()和Thread.resume()方法暂停或恢复线程的能力已被删除。方法已更改为抛出UnsupportedOperationException。这些方法本质上容易陷入僵局,自JDK 1.2(1998年)以来已被弃用。ThreadGroup中的相应方法,即暂停或恢复一组线程,已更改为在Java 19中抛出UnsupportedOperationException。
- Thread.Stop Changed to Throw UnsupportedOperationException (JDK-8289610) : 在此版本中,使用Thread.stop()方法“停止”线程的功能已被删除。该方法已更改为抛出UnsupportedOperationException。通过使其抛出java.lang.ThreadDeath来阻止线程本质上是不安全的。自JDK 1.2(1998)以来,停止方法已被弃用。ThreadGroup中的相应方法“停止”一组线程,已更改为在Java 19中抛出UnsupportedOperationException。同时, java.lang.ThreadDeath也被标记为废弃.
- Remove Support for javac -source/-target/–release 7 (JDK-8173605) : javac移出了一些选项
- Improved Control of G1 Concurrent Refinement Threads (JDK-8137022): G1并发细化线程的控制已被完全取代。新控制器通常分配更少的线程。它在细化线程活动中的峰值往往较少。它还倾向于延迟细化,当对相同或附近位置有多个写入时,允许通过写入屏障进行更多过滤,从而提高屏障的效率。
废弃功能
- java.net.URL Constructors Are Deprecated (JDK-8294241) : 废弃URL构造方法,推荐使用 java.net.URI 来构建URL.
- Deprecate JMX Management Applets for Removal (DK-8297794) : 废弃JMX
小优化
这里主要介绍一些小的优化, 太长可以不看.
- HTTP Response Input Streams Will Throw an IOException on Interrupt (JDK-8294047) : http请求中断抛出异常
- HttpClient Default Keep Alive Time is 30 Seconds (JDK-8297030) : 由java.net.http.HttpClient创建的HTTP/1.1和HTTP/2连接的默认空闲连接超时值已从1200秒减少到30秒
- Idle Connection Timeouts for HTTP/2 (JDK-8288717) : 此版本中添加了HTTP/2的空闲连接超时。
- FileChannel Positional Write Is Unspecified in APPEND Mode (JDK-6924219) : append模式下,FileChannel写入位置因操作系统而定
- Update Timezone Data to 2022c (JDK-8292579) : 此版本包括2022b的更改,将1970年后具有相同时间戳数据的多个区域合并到单个时区数据库中。所有时区ID保持不变,但合并的时区将指向共享区域数据库。
- IdentityHashMap’s Remove and Replace Methods Use Object Identity (JDK-8178355) : IdentityHashMap的这两个方法, 对象比较由
equals
改为==
- Support for CLDR Version 42 (JDK-8284840) : 基于Unicode Consortium的CLDR的本地数据已升级到版本42
- Introduce LDAP and RMI Protocol Specific Object Factory Filters to JNDI Implementation (JDK-8290368) : 引入了新的系统和安全属性,以允许对允许从JNDI/LDAP和JNDI/RMI上下文重建Java对象的JNDI对象工厂集进行更精细的控制
- G1: Disable Preventive GCs by Default (JDK-8293861) : G1默认禁用Preventive垃圾回收器
- appendToClassPathForInstrumentation Must Be Used in a Thread-Safe Manner (JDK-8296472) : 如题, 当时用java agent时,自定义类加载器中的appendToClassPathForInstrumentation方法必须以线程安全的方式添加到类搜索路径中。
- Deprecate and Disable Legacy Parallel Class Loading Workaround for Non-Parallel-Capable Class Loaders (JDK-8295673) : 一些用户定义的旧类加载器会通过在加载过程中释放类加载器锁来解决死锁问题。为了防止这些加载程序在通过并行线程加载同一类时遇到“java.lang.LinkageError:尝试重复类定义”,HotSpot虚拟机在JDK 6中引入了一种变通方法,将加载尝试序列化,导致随后的尝试等待第一个完成. 现在将这种变通 方法废弃了
- Disabled DTLS 1.0 (JDK-8256660) : 废弃 DTLS 1.0
- Remove Thread Text from Subject.current (JDK-8297276) : 在此版本中,Subject.current的规范已更改,以降低创建线程时继承主题的期望。此时,主题存储在AccessControlContext中,并在创建平台线程时被继承。虚拟线程在线程创建时不会捕获调用者上下文,并且不会继承AccessControlContext。在删除对SecurityManager和继承的AccessControlContext的支持之前,将在未来的版本中重新审查继承。
- Generalize ‘see’ and ‘link’ Tags for User-Defined Anchors (JDK-8200337) : {@link}、{@linkplain}和@see标签已增强,允许链接到JavaDoc生成的元素文档中的任意锚点。为了区分这些引用和成员引用,使用双散列标记(
##
)将元素名称与URI片段分开。
名词解析
HarfBuzz: 一个开源的用于文字塑形的软件开发库,亦即用于转换Unicode文本到字形指标及方位的过程
FreeType: 同HarfBuzz一样, 也是一个开源字体库. 它是一个用C语言实现的一个字体光栅化库。它可以用来将字符栅格化并映射成位图以及提供其他字体相关业务的支持
Preview(预览): 功能已经基本完整, 可以试用了. 可以简单理解为beta公测版. 来源于 JEP12
功能以预览版的形式发布,以收集有关它们的反馈而不承诺保持其向后兼容性——这意味着鼓励每个人尝试它们,但同时不鼓励在生产中使用它们。
预览功能不是开箱即用的,为了访问它们,需要使用*–enable-preview*编译器标志。
Incubator(孵化) : 实验性 API已经到了一定阶段, 已经计划开发出一整套完整的功能.以独立模块的形式发布. 来源于 JEP11
Experimental(实验) : vm级的早期功能, 不稳定, 功能不完整. 实验性质.
实验性功能代表(主要是)VM 级功能的早期版本,这些功能可能是有风险的、不完整的,甚至是不稳定的。在大多数情况下,需要使用专用标志启用它们
出于比较的目的,如果一个实验功能被认为是 25%“完成”,那么一个预览功能应该至少 95%“完成”。
预览,孵化,实验三者的关系大致: 实验 => 孵化 => 预览 => 合并jdk主体功能.
JEP : JDK Enhancement Proposal , jdk增强建议. 也就是我们常说的jdk新特性的来源. JEP大全
往期文章
参考文章
jdk20官方文档
jdk20新特性文档
jdk20升级指南
jdk20安装指南
jdk20的开发计划
jdk20虚拟机简介
jdk20垃圾回收机制
jdk20安全机制