关于rust:一文总结Java\JDK-17发布的新特性

37次阅读

共计 7233 个字符,预计需要花费 19 分钟才能阅读完成。

简介:JDK 17 曾经于 2021 年 3 月 16 日如期公布。本文介绍 JDK 17 新个性。JDK 17 于 2021 年 9 月 14 日正式公布(General-Availability Release)。JDK 17 将是大多数供应商的长期反对(LMS)版本。上一个 LTS 版本是 JDK 11。本文总结了 JDK 17 公布的新个性。

公布版本阐明

依据公布的布局,这次公布的 JDK 17 将是一个长期反对版(LTS 版)。LTS 版每 3 年公布一个,上一次长期反对版是 18 年 9 月公布的 JDK 11。

JDK 17 是 Java SE 平台版本 17 的开源参考实现,由 JSR 392 在 JCP(Java Community Process)指定。

安装包下载

次要分为 OpenJDK 版本和 Oracle 版本,下载地址如下:

OpenJDK 版本:https://jdk.java.net/16/
Oracle 版本:https://www.oracle.com/java/t…

上述版本,如果是集体学习用处,则差别不大。但如果是用于商业用途,则须要认真看好相干的受权。Oracle JDK 依据二进制代码许可协定取得许可,而 OpenJDK 依据 GPL v2 许可取得许可。

更多无关 Java 的基本知识,能够参阅《Java 外围编程》这本书,形容的十分具体。

JDK 17 新个性阐明

JEP 406:switch 的模式匹配(预览)(JDK-8213076)

specification

通过 switch 表达式和语句的模式匹配,以及模式语言的扩大,加强 Java 编程语言。将模式匹配扩大到 switch 容许对表达式进行测试,每个模式都有特定的操作,以便能够简洁而平安地表白简单的面向数据的查问。

无关更多详细信息,请参见 JEP 406

JEP 409:密封类(JDK-8260514)

specification

密封类(Sealed Class)已增加到 Java 语言中。密封类和接口限度了哪些其余类或接口能够扩大或实现它们。

密封类由 JEP 360 并在 JDK 15 中作为预览性能交付。它们再次被提出,并进行了改良,由 JEP 397 并在 JDK 16 中作为预览性能提供。当初,在 JDK 17 中,密封类正在最终确定,与 JDK 16 没有任何更改。

JEP 382:新的 macOS 渲染管道(JDK-8238361)

client-libs/2d

Swing API 用于渲染的 Java 2D API 当初能够应用新的 Apple Metal 减速渲染 API 给 macOS。

目前默认状况下,这是禁用的,因而渲染依然应用 OpenGL API,这些 API 被 Apple 弃用,但依然可用和反对。

要启用金属,应用程序应通过设置零碎属性指定其应用:

-Dsun.java2d.metal=true

Metal 或 OpenGL 的应用对应用程序是通明的,因为这是外部实现的区别,对 Java API 没有影响。Metal 管道须要 macOS 10.14.x 或更高版本。在晚期版本上设置它的尝试将被疏忽。

无关更多详细信息,请参见[JEP 382(https://openjdk.java.net/jeps…)

大图标拜访新 API(JDK-8182043)

client-libs/javax.swing

JDK 17 中提供了一个新的办法

javax.swing.filechooser.FileSystemView.getSystemIcon(File, int, int),该办法容许在可能的状况下拜访更高质量的图标。它已为 Windows 平台齐全施行;然而,其余平台上的后果可能会有所不同,稍后将加强。例如,通过应用以下代码:

FileSystemView fsv = FileSystemView.getFileSystemView();

Icon icon = fsv.getSystemIcon(new File("application.exe"), 64, 64);

JLabel label = new JLabel(icon);

用户能够为“application.exe”文件取得更高质量的图标。此图标实用于创立能够在 HighDPI 环境中更好地扩大的标签。

DatagramSocket 能够间接退出多播组(JDK-8237352)

core-libs/java.net

java.net.DatagramSocket 在此版本中已更新,以增加对退出多播组(multicast group)的反对。它当初定义了退出和来到多播组的退出组和来到组办法。java.net.DatagramSocket 的类级 API 文档已更新,以解释如何配置一般 DatagramSocket 并用于退出和来到多播组。

此更改意味着 DatagramSocket API 能够用于组播应用程序,而无需应用旧的 java.net.MulticastSocket API。MulticastSocket API 的工作原理和以前一样,只管它的大多数办法都被弃用了。

无关此变更理由的更多信息,请查看 CSRJDK-8260667

JEP 356:增强型伪随机数生成器(JDK-8193209)

core-libs/java.util

为伪随机数生成器(PRNG)提供新的接口类型和实现,包含可跳转的 PRNG 和一类额定的可拆分 PRNG 算法(LXM)。

Ideal Graph Visualizer 的现代化(JDK-8254145)

hotspot/compiler

Ideal Graph Visualizer(IGV)是一个可视化和交互式地摸索 HotSpot VM C2 即时(JIT)编译器中应用的两头示意的工具,曾经现代化。加强性能包含:

  • 反对在最多 JDK 15 上运行 IGV(IGV 底层 NetBeans 平台反对的最新版本)
  • 更快的、基于 Maven 的 IGV 构建零碎
  • 块造成、组删除和节点跟踪的稳固
  • 默认过滤器中更直观的着色和节点分类
  • 具备更天然默认行为的排名疾速节点搜寻

现代化的 IGV 局部兼容从晚期 JDK 版本生成的图形。它反对基本功能,如图形加载和可视化,但辅助性能,如节点聚类和着色可能会受到影响。

无关构建和运行 IGV 的详细信息,请参见 https://github.com/openjdk/jd…。

“New API”的新页面和改良的“Deprecated”页(JDK-8263468)

tools/javadoc(tool)

JavaDoc 当初能够生成一个页面,总结 API 中最近的更改。要包含的最近版本的列表是应用 –since 命令行选项指定的。这些值用于查找具备匹配 @since 的申明,因为要蕴含在新页面上的标记。–since-label 命令行选项提供了要在“New API”页面题目中应用的文本。

在总结已弃用我的项目的页面上,您能够查看按已弃用我的项目的版本分组的我的项目。

谬误音讯中的源详细信息(JDK-8267126)

tools/javadoc(tool)

当 JavaDoc 报告输出源文件中的问题时,它将以相似编译器(javac)诊断音讯的形式显示问题的源行,以及蕴含指向该行地位的插入符号(^)的行。

此外,日志记录和其余“信息”音讯当初写入规范谬误流,留下规范输入流用于命令行选项特地申请的输入,如命令行帮忙。

JEP 412:内部函数和内存 API(孵化)(JDK-8265033)

core-libs

引入一个 API,Java 程序能够通过该 API 与 Java 运行时之外的代码和数据互操作。通过无效地调用内部函数(即 JVM 内部的代码),并通过平安地拜访内部内存(即不禁 JVM 治理的内存),该 API 使 Java 程序可能调用本机库并解决本机数据,而不会有 JNI 的脆弱性和危险。

无关更多详细信息,请参阅 JEP 412

控制台字符集 API(JDK-8264208)

core-libs

java.io.Console 已更新,以定义一个新办法,该办法返回控制台的 Charset。返回的 Charset 可能与 Charset.defaultCharset()办法返回的 Charset 不同。例如,它返回 IBM437,而 Charset.defaultCharset()在 Windows (en-US)上返回 windows-1252。请参阅 https://bugs.openjdk.java.net… 理解更多详细信息。

用于反序列化的 JDK Flight Recorder 事件(JDK-8261160)

core-libs/java.io:serialization

当初能够应用 JDK Flight Recorder (JFR)监控对象的反序列化。当启用 JFR 且 JFR 配置包含反序列化事件时,每当运行程序尝试反序列化对象时,JFR 将收回事件。反序列化事件名为 jfr.Derialization,默认状况下禁用。反序列化事件蕴含序列化筛选器机制应用的信息;请参阅对象输出筛选器标准。此外,如果启用了过滤器,JFR 事件批示过滤器是承受还是回绝对象的反序列化。无关如何应用 JFR 反序列化事件的更多信息,请参阅文章监控反序列化进步利用安全性。无关应用和配置 JFR 的参考信息,请参阅 JFR 运行时指南和 JFR 命令参考 JDK 工作管制文件的章节。

JEP 415:实现特定于上下文的反序列化过滤器(JDK-8264859)

core-libs/java.io:serialization

JEP 415:特定于上下文的反序列化过滤器容许应用程序通过 JVM 范畴的过滤器工厂配置特定于上下文的和动静抉择的反序列化过滤器,该工厂被调用认为每个独自的反序列化操作抉择过滤器。

用于序列化过滤的 Java 外围库开发人员指南介绍了用例,并提供了示例。

本机字符编码名称的零碎属性(JDK-8265989)

core-libs/java.lang

引入了一个新的零碎属性本机.encode。此零碎属性提供根底主机环境的字符编码名称。例如,它通常在 Linux 和 macOS 平台中具备 UTF-8,在 Windows (en-US)中具备 Cp1252。请参阅 https://bugs.openjdk.java.net… 理解更多详细信息。

增加 java.time.InstantSource (JDK-8266846)

core-libs/java.time

引入了一个新的接口 java.time.InstantSource。此接口是 java.time.Clock 的形象,只关注以后时刻,不援用时区。

十六进制格局和解析实用程序(JDK-8251989)

core-libs/java.util

java.util.HexFormat 为基元类型和字节数组提供十六进制和十六进制之间的转换。分隔符、前缀、后缀和大写或小写的选项由返回 HexFormat 实例的工厂办法提供。

试验 Compiler Blackholes 反对(JDK-8259316)

hotspot/compiler

减少了对 Compiler Blackholes 的试验反对。这些对于低级基准测试十分有用,以防止要害门路上的死代码打消,而不影响基准性能。以后的反对以 CompileCommand 的模式实现,可拜访为 -XX:CompileCommand=blackhole,,并打算最终将其毕业到公共 API。

JMH 曾经可能在批示 / 可用时自动检测和应用此设施。无关后续步骤,请查阅 JMH 文档。

HotSpot JVM 中的新类层次结构剖析实现(JDK-8266074)

hotspot/compiler

HotSpot JVM 中引入了一个新的类层次结构剖析实现。它的特点是对形象和默认办法的加强解决,从而改良了 JIT 编译器所做的内联决策。新实现将取代原始实现,并在默认状况下关上。

为了帮忙诊断与新实现相干的可能问题,能够通过指定 -XX:+UnlockDiagnosticVMOptions -XX:-UseVtableBasedCHA 命令行标记来关上原始实现。

原始实现可能会在将来的版本中删除。

JEP 391: macOS/AArch64 端口(JDK-8251280)

hotspot/compiler

macOS 11.0 当初反对 AArch64 体系结构。此 JEP 在 JDK 中实现了对 macos-aarch64 平台的反对。增加的性能之一是反对 W^X(write xor execute)内存。它仅对 macos-aarch64 启用,并能够在某些时候扩大到其余平台。JDK 能够在英特尔计算机上穿插编译,也能够在基于 Apple M1 的计算机上编译。

无关更多详细信息,请参见 JEP 391

对立日志反对异步日志刷新(JDK-8229517)

hotspot/runtime

为了防止应用对立日志记录的线程中呈现不心愿的提早,用户当初能够申请对立日志记录零碎在异步模式下运行。这能够通过传递命令行选项 -Xlog:async 来实现。在异步日志记录模式下,日志站点将所有日志记录音讯入队到缓冲区。独立线程负责将它们刷新到相应的输入。两头缓冲区是有界的。缓冲区耗尽时,入队音讯将被抛弃。用户能够应用命令行选项 -XX:AsyncLogBufferSize=. 来管制两头缓冲区的大小。

ARM 上的 macOS 晚期拜访可用(JDK-8266858)

infrastructure/build

新的 macOS 当初可用于 ARM 零碎。ARM 端口的行为应与英特尔端口相似。没有已知的性能差别。在 macOS 上报告问题时,请指定是应用 ARM 还是 x64。

反对在 Keytool -genkeypair 命令中指定签名者(JDK-8260693)

security-libs/java.security

-signer 和 -signerkeypass 选项已增加到 keytool 实用程序的 -genkey 对命令中。-signer 选项指定签名者的私钥条目标密钥库别名,-signerkeypass 选项指定用于爱护签名者私钥的明码。这些选项容许 keytool -genkey 对应用签名者的私钥对证书进行签名。这对于生成具备密钥协商算法作为公钥算法的证书特地有用。

SunJCE 提供程序通过 AES 明码反对 KW 和 KWP 模式(JDK-8248268)

security-libs/javax.crypto

SunJCE 提供程序已失去加强,以反对 AES 密钥换行算法(RFC 3394)和带填充算法的 AES 密钥换行算法(RFC 5649)。在晚期版本中,SunJCE 提供程序在“AESWrap”明码算法下反对 RFC 3394,该算法只能用于包装和解包装密钥。通过此加强,减少了两种分组明码模式,KW 和 KWP,反对应用 AES 进行数据加密 / 解密和密钥包装 / 解包装。无关更多详细信息,请查看“JDK 提供程序文档”指南的“SunJCE 提供程序”局部。

新 SunPKCS11 配置属性(JDK-8240256)

security-libs/javax.crypto:pkcs11

SunPKCS11 提供程序增加了新的提供程序配置属性,以更好地管制本机资源的应用。SunPKCS11 提供程序应用本机资源以便与本机 PKCS11 库一起工作。为了治理和更好地管制本机资源,增加了额定的配置属性,以管制革除本机援用的频率,以及是否在登记后销毁根底 PKCS11 令牌。

SunPKCS11 提供程序配置文件的 3 个新属性是:

destroyTokenAfterLogout(布尔值,默认值为 false)如果设置为 true,则在 SunPKCS11 提供程序实例上调用 java.security.AuthProvider.logout() 时,根底令牌对象将被销毁,资源将被开释。这基本上会在 logout() 调用后使 SunPKCS11 提供程序实例不可用。请留神,不应将此属性设置为 true 的 PKCS11 提供程序增加到零碎提供程序列表中,因为提供程序对象在 logout() 办法调用后不可用。

cleaner.shortInterval(整数,默认值为 2000,以毫秒为单位)这定义了在忙碌期间革除本机援用的频率,即 cleaner 线程应多久解决队列中不再须要的本机援用以开释本机内存。请留神,cleaner 线程将在 200 次失败尝试后切换到“longInterval”频率,即在队列中找不到援用时。

cleaner.longInterval(整数,默认值为 60000,以毫秒为单位)这定义了在非忙碌期间查看本机援用的频率,即 cleaner 线程应查看队列中的本机援用的频率。请留神,如果检测到用于清理的本机 PKCS11 援用,cleaner 线程将切换回“短距离”值。

具备零碎属性的可配置扩大(JDK-8217633)

security-libs/javax.net.ssl

已增加两个新的零碎属性。零碎属性 jdk.tls.client.disableExts 用于禁用客户端中应用的 TLS 扩大。零碎属性 jdk.tls.server.disableExts 用于禁用服务器中应用的 TLS 扩大。如果禁用了扩大,则在握手音讯中既不会生成也不会解决扩大。

属性字符串是在 IANA 文档中注册的逗号分隔的规范 TLS 扩大名称列表(例如,server_name、status_request 和签名_algorithms_cert)。请留神,扩展名辨别大小写。未知、不反对、拼写错误和反复的 TLS 扩大名称令牌将被疏忽。

请留神,阻止 TLS 扩大的影响是简单的。例如,如果禁用了强制扩大,则可能无奈建设 TLS 连贯。请不要禁用强制扩大,除非您分明地理解其影响,否则不要应用此性能。

包摘要页面上的“Related Packages”(JDK-8260388)

tools/javadoc(tool)

软件包的摘要页面当初包含一个列出任何“Related Packages”的局部。Related Packages(相干软件包)是依据常见命名约定启发式确定的,可能包含以下内容:

  • “parent”包(即,包是子包的包)
  • 同级包(即具备雷同父包的其余包)
  • 任何子包

相干软件包不肯定都在同一个模块中。

原文链接
本文为阿里云原创内容,未经容许不得转载。

正文完
 0