简介: 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”包(即,包是子包的包)
  • 同级包(即具备雷同父包的其余包)
  • 任何子包

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

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