文章目录
1. New Features 新功能
1.1 core-libs 核心库
1.1.1 【java.nio】FileSystems 新增方法 newFileSystem()
- newFileSystem(Path)
- newFileSystem(Path, Map<String, ?>)
- newFileSystem(Path, Map<String, ?>, ClassLoader)
1.1.2 【java.nio】ByteBuffer 定义了批量get和put方法传输字节,无需考虑缓冲区位置
1.1.3 【java.time】日本的新年号
JapaneseEra.of(3)
JapaneseEra.valueOf(“Reiwa”)
1.1.4 【java.util】i18n 支持Unicode 12.1
1.2 hotspot 热点
1.2.1 【gc】ZGC 不提交未使用的存储器
ZGC(Z garbage collector)
ZGC会将未使用的堆(heap)内存返回给操作系统。减少内存占用。
默认启动该功能,可通过以下配置显式禁用该功能。另外如果最小堆(-Xms)大小等于最大堆(-Xmx)大小,将隐式禁用该功能。
-XX:-ZUncommit
通过以下配置设置未提交的延时时长,默认延时时长为300s
-XX:ZUncommitDelay=
1.2.2 【gc】添加-XXSoftMaxHeapSize
通过该配置,使得GC 注重控制堆增长,避免内存溢出。该配置必须启用ZGC 才生效。
-XX:+UseZGC
-XX:SoftMaxHeapSize=
1.2.3 【gc】ZGC 最大堆内存从4TB 扩展到16TB
1.2.4 【runtime】JEP 350:动态CDS 归档
JEP 350
扩展应用程序类数据共享,以允许在Java应用程序执行结束时动态归档类。归档的类将包括默认基层CDS归档中不存在的所有已加载应用程序类和库类。
1.3 security-libs 安全库
1.3.1 【java.security】CRL 可配置读取超时
配置下面这个系统属性,来设置CRL 检索的最大读取超时时长;单位为秒,默认15s,值为0 表示时间无限长。
com.sun.security.crl.readtimeout
1.3.2 【java.security】查看TLS 配置信息的命令
keytool -showinfo -tls
1.3.3 【javax.crypto】支持MS CNG 密码学
CNG(Cryptography Next Generation)
SunMSCAPI提供程序现在支持读取下一代加密(CNG)格式的私钥。支持从Windows密钥库(例如“ Windows-MY”)中加载CNG格式的RSA和EC密钥。
1.3.4 【javax.crypto:pkcs11】SunPKCS11 提供更新升级以支持PKCS#11 V2.40
1.3.5 【javax.net.ssl】TLS 支持X25519 和X448
1.3.6【javax.net.ssl】JSSE 程序无状态支持恢复会话
TLS 服务器会将内部会话(session)信息以加密会话票证的形式,发送给支持无状态的客户端。该加密会话票证会在与TLS 握手期间,呈现给服务器,以恢复会话。
新增加两个系统属性来支持该特性:
client 用在客户端,用于在TLS 1.2的ClientHello 消息上切换会话票据扩展,false(默认) 不发送票据扩展, true 发送票据扩展。
server 当客户端支持时,允许服务器使用无状态的会话票证,不支持无状态会话票证的客户端将使用缓存。false(默认) 不支持无状态,true 支持无状态。
jdk.tls.client.enableSessionTicketExtension: false
jdk.tls.server.enableSessionTicketExtension: false
1.3.7 【javax.security】允许禁用SASL 机制
下面的安全属性支持禁用SASL 机制。
jdk.sasl.disabledMechanisms
SASL 机制
在Sasl.createSaslClient 或Sasl.createSaslServer 指定禁用的机制mechanisms/mechanism。此安全属性的默认值为空,这意味着没有任何机制被禁用。
String[] mechanisms = new String[]{"DIGEST-MD5", "PLAIN"};
SaslClient sc = Sasl.createSaslClient(mechanisms, authzid, protocol,
serverName, props, callbackHandler);
SaslServer ss = Sasl.createSaslServer(mechanism, protocol,
myName, props, callbackHandler);
1.3.8 【javax.xml.crypto】用于Canonical XML 1.1 URI的新字符串常量
javax.xml.crypto.dsig.CanonicalizationMethod API 增加了下面的字符串常量。分别代表带有XML签名注释算法的Canonical XML 1.1和Canonical XML 1.1的URI。
INCLUSIVE_11
INCLUSIVE_11_WITH_COMMENTS
1.3.9 【javax.xml.crypto】[xmldsig]添加了KeyValueEC_TYPE
目前支持W3C XML 签名语法和处理建议中描述的ECKeyValue 类型。
新的EC_TYPE 类型常量已添加到javax.xml.crypto.dsig.keyinfo.KeyValue 接口。
当前仅支持NamedCurve 域参数类型,并且不支持ECParameters 显式曲线参数类型。
1.3.10 【org.ietf.jgss】在Windows上添加了默认的本地GSS-API 库
Windows 已将本地GSS-API 库添加到JDK,可以通过将system属性sun.security.jgss.lib 设置为其路径来加载第三方本机GSS-API库。也可以通过一下配置来加载启动它。
sun.security.jgss.native: true
1.3.11 【org.ietf.jgss:krb5】支持Kerberos跨域引用(RFC 6806)
通过支持RFC 6806 协议扩展定义的主体名称规范化和跨领域引用,增强了Kerberos客户端。
默认启动该特性,且5 是允许的引荐跃点的最大数量。通过下面配置设置关闭该特性,可自定义最大引荐跃点。
sun.security.krb5.disableReferrals: false
sun.security.krb5.maxReferrals: 10
1.4 tools 工具
1.4.1 【javac】Switch 表达式的模式匹配
分支程序:
String formatted = "unknown";
if (obj instanceof Integer i) {
formatted = String.format("int %d", i);
}
else if (obj instanceof Byte b) {
formatted = String.format("byte %d", b);
}
else if (obj instanceof Long l) {
formatted = String.format("long %d", l);
}
else if (obj instanceof Double d) {
formatted = String.format("double %f", d);
}
else if (obj instanceof String s) {
formatted = String.format("String %s", s);
}
方式一:
String formatted;
switch (obj) {
case Integer i: formatted = String.format("int %d", i); break;
case Byte b: formatted = String.format("byte %d", b); break;
case Long l: formatted = String.format("long %d", l); break;
case Double d: formatted = String.format("double %f", d); break;
case String s: formatted = String.format("String %s", s); break
default: formatted = obj.toString();
}
方式二:
注意:表达式obj 最多匹配以下条件之一。复杂度O(1),扩展表达式和语句的case 标签switch 以采用类型测试模式,而不仅仅是常量。
String formatted =
switch (obj) {
case Integer i -> String.format("int %d", i)
case Byte b -> String.format("byte %d", b);
case Long l -> String.format("long %d", l);
case Double d -> String.format("double %f", d);
case String s -> String.format("String %s", s);
default -> obj.toString();
};
1.4.2 【javac】文本块
Java 支持text blocks;文本块是一种多行字符串文字,它避免了大多数转义序列的需要,以一种可预测的方式自动设置字符串的格式,并在需要时使开发人员可以控制格式。 这是JDK 13中的预览语言功能。
1.5 xml
1.5.1 【jaxp】命名空间支持创建DOM 和SAX 工厂的新方法
默认情况下,添加了用于实例化具有命名空间支持的DOM 和SAX 工厂的新方法。这些方法在它们的现有方法之前以"NS"作为前缀,"NS"代表NamespaceAware。
- newDefaultNSInstance()
- newNSInstance()
- newNSInstance(String factoryClassName, ClassLoader classLoader)
使用这些新方法,默认情况下,通过工厂创建的解析器将为NamespaceAware。例如,以下语句:
DocumentBuilder db = DocumentBuilderFactory.newDefaultNSInstance().newDocumentBuilder();
等效于:
DocumentBuilderFactory dbf = DocumentBuilderFactory.newDefaultInstance();
dbf.setNamespaceAware(true);
DocumentBuilder db = dbf.newDocumentBuilder();
2. Removed Features and Options 删除的功能和建议
2.1 client-libs 客户端库
2.1.1 移除系统属性 awt.toolkit
并未真正的移除,只是在JDK 1.9 及之后从文档上移除了;该类由于模块系统封装,并且是内部细节,不支持直接操作。以前读取此属性的应用程序,仍然可以通过实例化AWT 工具包和该实例查询类的名称来获取它。
2.2 core-libs 核心库
2.2.1 【java.lang】移除运行时跟踪方法
java.lang.Runtime 移除了下面的方法,方法的预期功能目前被Java Virtual Machine Tool Interface (JVMTI) 提供。
traceInstructions(boolean);
traceMethodCalls(boolean);
2.2.2 【java.net】SocketImpl 不再支持JDK 1.4 之前的实现
移除了JDK 1.3 及更早版本的SocketImpl 自定义实现,对JDK1.4 及之后的实现无影响。
2.3 hotspot 热点
2.3.1 【runtime】移除VM项:-XX:+AggressiveOpts
在JDK 11 中不建议使用该配置,在JDK 12 使用该配置会有警告,且忽略该配置使其不起作用。在JDK 13 中使用该配置会初始化错误。
-XX:+AggressiveOpts
2.4 security-libs 安全库
2.4.1 【java.security】SunJSSE 不再支持重复的RSA 服务
以下RSA 服务SunJSSE 不再提供支持
- RSA KeyFactory
- RSA KeyPairGenerator
- MD2withRSA
- MD5withRSA
- SHA1withRSA Signature
2.4.2 【java.security】移除T-Systems Deutsche Telekom Root CA 2 证书
该证书已过期,并从cacerts 密钥库移除。
- 别名:deutschetelekomrootca2 [jdk]
专有名称:CN = Deutsche Telekom Root CA 2,OU = T-TeleSec Trust Center,O = Deutsche Telekom AG,C = DE
2.4.3 【java.security】移除两个DocuSign root CA 证书
证书已过期,并从cacerts 秘钥库移除。
- 别名:certplusclass2primaryca [jdk]
专有名称:CN=Class 2 Primary CA, O=Certplus, C=FR - 别名:certplusclass3pprimaryca [jdk]
专有名称:CN=Class 3P Primary CA, O=Certplus, C=FR
2.4.4【java.security】移除两个Comodo Root CA 证书
证书已过期,并从cacerts 秘钥库移除。
- 别名:utnuserfirstclientauthemailca [jdk]
专有名称:CN=UTN-USERFirst-Client Authentication and Email, OU=http://www.usertrust.com, O=The USERTRUST Network, L=Salt Lake City, ST=UT, C=US - 别名:utnuserfirsthardwareca [jdk]
专有名称:CN=UTN-USERFirst-Hardware, OU=http://www.usertrust.com, O=The USERTRUST Network, L=Salt Lake City, ST=UT, C=US
2.4.5【javax.net.ssl】删除仅用于与旧版JSSE 1.0 应用程序兼容的内部软件包
2.4.6【javax.net.ssl】移除SunJSSE 提供的实验性FIPS 140 兼容模式
FIPS(Federal Information Processing Standards)
实验性FIPS 140 兼容模式已从SunJSSE 提供程序中删除。FIPS Publication 140-2是一种针对密码模块的安全需求标准。
2.5 tools 工具
2.5.1 【javadoc】移除javadoc 中四个废弃的功能
以下四个功能已从javadoc工具中删除:
- 使用HTML4 生成API 文档
- 使用HTML 框架生成API 文档
- 对旧的javadoc API 的支持
包括jdk.javadoc 模块中的 com.sun.javadoc,com.sun.tools.doclets.standard,com.sun.tools.javadoc.Start - 对项–no-module-directories 的支持
3. JDK 13 Release Notes 发行说明
扩展查看:发行说明