JDK 19在2022年10月18日发布了, 本文就是简单介绍一下这次更新的新特性与改动.
一句话总结, 这仍然是jdk的一个短期支持版本, 而且官方承诺,这次升级将尽可能的保证版本的向下兼容.
新特性汇总
新特性
1 预览版
- JEP 425 Virtual Threads(虚拟线程) : 类似go的协程. 就是在线程上面在开辟出一个更细粒度独立运行的单元. 这个新单元就是虚拟线程, 这个线程官方叫carrier thead(承载线程?)
- JEP 405 Record Patterns (记录模式) : Record Patterns 可对 record 的值进行解构,Record patterns 和 Type patterns 通过嵌套能够实现强大的、声明性的、可组合的数据导航和处理形式.
- JEP 427 Pattern Matching for switch (switch模式匹配) : 第三次预览. 用 switch 表达式和语句的模式匹配,以及对模式语言的扩展来增强 Java 编程语言。将模式匹配扩展到 switch 中,允许针对一些模式测试表达式,这样就可以简明而安全地表达复杂的面向数据的查询。
- JEP 424 Foreign Function & Memory API (外边函数&内存调用API): 提供了一套API 方便的调用 Java 运行时之外的代码或内存。通过高效地调用外部函数(即 JVM 之外的代码)和安全地访问外部内存(即不受 JVM 管理的内存),该 API 使 Java 程序能够调用本机库并处理本机数据,而不会像 JNI 那样危险和脆弱. (Java 在堆外内存使用的路上越走越远 🤪)
2 孵化器
- JEP 428 Structured Concurrency(结构化并发) : 用来简化并发的功能. 可以将底层多个线程视为一个工作单元, 从而实现像单线程那样的异常处理, 结果收集.
- JEP 426 Vector API (向量API) : 第四孵化阶段. 向量计算由对向量的一系列操作组成。向量 API 用来表达向量计算,该计算可以在运行时可靠地编译为支持的 CPU 架构上的最佳向量指令,从而实现优于等效标量计算的性能。向量 API 的目标是为用户提供简洁易用且与平台无关的表达范围广泛的向量计算
3 主要特性
Support Unicode 14.0 (JDK-8268081) : 支持Unicode14.0 .
New system properties for
System.out
andSystem.err
(JDK-8283620) : 新增了stdout.encoding
和stderr.encoding
两个属性来支持标准输出和错误输出的字符集编码. 可以有效解决标准输出的乱码问题.HTTPS Channel Binding Support for Java GSS/Kerberos (JDK-8279842) : 在https连接的时候, 支持绑定token来增强安全.
Additional Date-Time Formats (JDK-8176706) :
java.time.format.DateTimeFormatter
增加了一些新的默认格式New Methods to Create Preallocated HashMaps and HashSets (JDK-8186958) : HashMap, HashSet新增了一些静态创建方法. 比如
HashMap.newHashMap LinkedHashMap.newLinkedHashMap WeakHashMap.newWeakHashMap HashSet.newHashSet LinkedHashSet.newLinkedHashSet
upport for PAC-RET Protection on Linux/AArch64 (JDK-8277204) : 通过支持ARMv8.3 的PAC功能来防御RET的攻击
When enabled, OpenJDK will use hardware features from the ARMv8.3 Pointer Authentication Code (PAC) extension to protect against Return Orientated Programming (ROP) attacks. For more information on the PAC extension see “Providing protection for complex software” or the “Pointer authentication in AArch64 state” section in the Arm ARM.
Automatic Generation of the CDS Archive (JDK-8261455) : CDS的自动打包功能
Windows KeyStore Updated to Include Access to the Local Machine Location (JDK-6782021) : Windows新增了一些密钥储库支持访问本地位置.
Break Up SEQUENCE in X509Certificate and X509Certificate in otherName (JDK-8277976) : 如题, 这两个方法的增强.
The JDK implementation of
X509Certificate::getSubjectAlternativeNames
andX509Certificate::getIssuerAlternativeNames
has been enhanced to additionally return thetype-id
andvalue
fields of anotherName
. Thevalue
field is returned as a String if it is encoded as a character string or otherwise as a byte array, which is helpful as it avoids having to parse the ASN.1 DER encoded form of the name.(D)TLS Signature Schemes (JDK-8280494): 增加了一套新的获取TLS签名的方法.
Add a -providerPath Option to jarsigner (JDK-8281175) : jarsigner新增了一个选项, 用来指定备用密钥库路径
New Options for ktab to Provide Non-default Salt (JDK-8279064) : ktab命令增加了一些选项来支持自定义’盐’值.
ktab -a username password -s altsalt
New XML Processing Limits (JDK-8270504 (not public)) : xml库解析执行增加了3个限制
jdk.xml.xpathExprOpLimit
: XPath表达式中group数量的限制jdk.xml.xpathExprOpLimit
: XPath表达式中operator数量的限制jdk.xml.xpathTotalOpLimit
: XPath文件中operator总数量的限制
bug修复
- JDK-8289853 : HarfBuzz库升级 到 to 4.4.1, 支持最新的字体
- JDK-8290334 : FreeType 升级到 2.12.1
- JDK-8291897 : 解决TerminatingThreadLocal在virtual thread(虚拟线程)某些场景下无法注册的问题
- JDK-8292240 : 虚拟线程的承载线程, 某些情况下阻塞时无法重置状态的问题
- JDK-8287917 : macOS SDK 10.15 及更早版本下System.loadLibrary不生效的问题
- JDK-8292654 : JDK-8286115问题修复导致的G1垃圾回收器 remembered set memory footprint问题
移出功能
- Diagnostic Flag GCParallelVerificationEnabled (JDK-8286304) : 这个开关被移出了. 因为自从创建以来一直都是默认开启, 且并发效率比关闭高很多.
- Finalizer Implementation in SSLSocketImpl (JDK-8212136) : SSLSocket的finalizer被移除, 因为基础方法(native)已经实现相关功能.
- Alternate ThreadLocal Implementation of the Subject::current and Subject::callAs APIs (JDK-8282676 (not public)) : 所述类里的相应方法的备用threadlocal实现被移除.
废弃功能
- java.lang.ThreadGroup (JDK-8284161) : 线程组被标记为废弃. 最大的原因是虚拟线程来了.
- Locale Class Constructors (JDK-8282819) : Locale的构造器被
Locale.of()
方法替代 - PSSParameterSpec(int) Constructor and DEFAULT Static Constant (JDK-8254935)
- OAEPParameterSpec.DEFAULT Static Constant (JDK-8284553) : 因为密码学的进步, 这个Default常量已经落后了.
小优化
这里主要介绍一些小的优化, 太长可以不看.
JDK19中, 在macOS上将Metal作为图形渲染的默认配置.
像mac或linux系统中,
user.home
存在就用系统提供的配置 , 如果不存在, 则使用$HOME
的配置设置这个系统属性.线程的ClassLoader 被处理为一个特殊的可继承的Thread-local
java.lang.Thread 新增了一些方法, 如果现在代码继承了Thread, 可能会导致不兼容.
Thread.Builder模式
Thread.isVirtual()
Thread.threadId()
Thread.join(Duration)
Double.toString(double) and Float.toString(float) 针对科学记数法的一些优化
注解的toString方法针对常量和枚举, 做了一些优化, 输出更友好.
HTTP签名鉴权时, MD5和SHA-1 因为不太安全默认被禁用.
Windows 上http多代理选择的优化
java.net.InetAddress 针对一些有歧义的IPv4输入, 精细了异常提示.
HttpURLConnection 的默认keep alive 可配置
FileChannel.transferFrom 返回的bytes 可能会小于预订值, 这是允许的.
FileChannel.transferFrom()的性能在Linux内核4.5及更高版本上得到了显著提高
InputStream and FilterInputStream 的mark和reset 移出了 synchronized 关键字
Files.copy 方法支持将
POSIX
属性跨文件系统复制, 前提是两个系统都支持POSIX
FileChannel.lock(long position, long size, boolean shared) 当size指定为0时, 表示锁定 整个文件, 无论这个文件流被扩展或继承
java.time.chrono 新增了3个标准时间
ForkJoinPool 和 ThreadPoolExecutor 线程池不再使用Thread.start来启动工作线程.
正则
\b
可以匹配ASCII 字符, 像\w
一样.支持 CLDR Version 41
LDAP, DNS, 和 RMI 的URL解析更加严格
> -Dcom.sun.jndi.ldapURLParsing="legacy" | "compat" | "strict" (to control "ldap:" URLs)
>
> -Dcom.sun.jndi.dnsURLParsing="legacy" | "compat" | "strict" (to control "dns:" URLs)
> -Dcom.sun.jndi.rmiURLParsing="legacy" | "compat" | "strict" (to control "rmi:" URLs)
VM Tool Interface (JVM TI) 支持虚拟线程
cpu计算时不再考虑
cpu.share
, 因为会导致jvm对当前cpu使用情况的误算, 进而影响cpu使用率.之前的JDK版本对Linux cgroups参数“cpu.shares”使用了错误的解释。这可能会导致JVM使用的CPU少于可用,导致JVM在容器内使用时CPU资源利用率不足。
从此JDK版本开始,默认情况下,JVM在决定各种线程池使用的线程数量时不再考虑“cpu.shares”。-XX:+UseContainerCpuShares命令行选项可用于恢复到之前的行为。此选项已被弃用,可能会在未来的JDK版本中删除。
此后, macOS中,相同大版本的jdk将默认安装到同一目录
Oracle JDK安装目录从
/Library/Java/JavaVirtualMachines/jdk-${VERSION}.jdk
迁移到/Library/Java/JavaVirtualMachines/jdk-${FEATURE}.jdk
比如: 19.0.1 and 19.0.2 版本都将安装到
/Library/Java/JavaVirtualMachines/jdk-19.jdk
中在macOS上,只有用户钥匙串中具有正确信任设置的证书才会在钥匙串类型的钥匙库中作为受信任证书条目公开
RC2和ARCFOUR(RC4)算法已添加到java.security配置文件中的jdk.security.legacyAlgorithms安全属性中。当弱RC2或ARCFOUR算法用于与密钥存储中的秘密密钥条目关联的命令时,密钥工具会发出警告。
加密算法位数增强
RSA, RSASSA-PSS, DH: from 2048 to 3072
EC: from 256 to 384
AES: from 128 to 256 (if permitted by crypto policy), falls back to 128 otherwise.
- ECDSA 算法的 Signature::getParameters 永远返回
null
. 参考 RFC 5758 Section 3.2 - DES、DESede和MD5算法已添加到java.security配置文件中的jdk.security.legacyAlgorithms安全属性中。当弱DES或DESede算法用于与密钥库中的秘密密钥条目关联的命令时,keytool工具会发出警告。
- 加密算法完成支持 RFC 6125
- 移出了一些过时的3DES加密组件
TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA
TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA
SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA
SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA
TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA
TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA
SSL_RSA_WITH_3DES_EDE_CBC_SHA
30 修复了一个StringBuilder bug. 例如, 下面代码输出”foofoobar” 而不是 “foobarfoobar”
StringBuilder builder = new StringBuilder("foo");
System.err.println("" + builder + builder.append("bar"));
JavaDoc生成的API文档现在提供了一个独立的搜索页面,搜索语法已得到增强,允许多个搜索词。
JShell现在标记不建议使用的元素,并在控制台中突出显示变量和关键字。
实际的java线程堆栈大小可能与-Xss命令行选项指定的值不同;当操作系统要求时,它可以四舍五入到系统页面大小的倍数。
名词解析
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大全
参考文章
文档信息
- 本文作者:寒澈
- 本文链接:https://www.hancher.top/2022/10/20/jdk-v19/
- 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)