一文总结Java\JDK 17发布的新特性

简介: 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版本:JDK 16.0.2 GA Release
  • Oracle版本:Java Downloads | Oracle

上述版本,如果是个人学习用途,则差异不大。但如果是用于商业用途,则需要仔细看好相关的授权。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 409

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/382)

大图标访问新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)。

有关更多详细信息,请参见JEP 356

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的详细信息,请参见jdk17/src/utils/IdealGraphVisualizer at master · openjdk/jdk17 · GitHub。

“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。请参阅[JDK-8264209] Console charset API - Java Bug System了解更多详细信息。

用于反序列化的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。请参阅[JDK-8266075] System property for the native character encoding name - Java Bug System了解更多详细信息。

添加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”包(即,包是子包的包)
  • 同级包(即具有相同父包的其他包)
  • 任何子包

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/512382.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

bash: 未预期的符号 `( 附近有语法错误_安规群中关于泄漏电流测试、接地符号等相关的6个问题,快来围观大神的回答吧!...

【本文属"世界认证地图"原创,未经允许,请勿转载哦~~~】问题一群员提问:接地这样符合GB4706.1-2005的标准要求吗?图片由群友提供群友解答:接地符号标错地方,应该如下图图片由群友提供专家解答&…

怎么测试服务器的性能,如何测试服务器性能

如何测试稳定性测试已知系统高峰期使用人数、各事务操作频率等。设计综合测试场景,测试时,将每个场景按照一定人数比例一起运行,模拟用户使用数的情况。并监控在测试中,系统各性能指标在这种压力下是否能保持正常数值。事务响应时…

WPF自定义控件的三种方式

简介: 某些场景下,我们确实需要创建新的控件。此时,理解 WPF不同控件的创建方法就显得非常重要。 WPF 提供3个用于创建控件的方法,每个方法都提供不同的灵活度。 WPF控件可以通过数据模型(DataTemplate)、…

多项“首次”落地 腾讯云数据库助力金融机构国产化

日前,IDC发布了《2021年上半年中国关系型数据库软件市场跟踪报告》,数据显示,我国关系型数据库市场规模迅速增长。2021上半年,中国关系型数据库软件市场规模为11.9亿美元,整体市场同比增长37.2%。IDC预测,2…

庖丁解牛-图解MySQL 8.0优化器查询转换篇

简介: 在《庖丁解牛-图解MySQL 8.0优化器查询解析篇》一文中我们重点介绍了MySQL最新版本8.0.25关于SQL基本元素表、列、函数、聚合、分组、排序等元素的解析、设置和转换过程,本篇我们继续来介绍更为复杂的子查询、分区表和JOIN的复杂转换过程。 作者 |…

5e检索服务器信息,5Eplay易玩网服务器出租常见问题解答(FAQ)

Q1:我什么时间可以租服?A:我们的工作时间是每周一到周五的上午九点到下午六点(节假日除外),您可以先测试服务器,然后在工作时间联系我们。测试服:[上海电信]: 101.227.68.10:9999 进服密码123 [北京双线]: …

hivesql修改字段类型_Hive SQL语法总结

Hive是一个数据仓库基础的应用工具,在Hadoop中用来处理结构化数据,它架构在Hadoop之上,通过SQL来对数据进行操作,了解SQL的人,学起来毫不费力。Hive 查询操作过程严格遵守Hadoop MapReduce 的作业执行模型,…

Cube 技术解读 | 支付宝新一代动态化技术架构与选型综述

简介: 支付宝客户端的动态化技术经历三个阶段:现阶段也就是第三阶段是实体组件部分光栅化的hybrid模式,Cube 就是该模式下的产物。 如标题所述,笔者将持续更新《Cube 技术解读》系列文章。本文为Cube系列首篇文章,后续…

阿里云数字巡展:“云上峰会”背后的秘密武器

简介: 近日,阿里云官网上线了叫做“数字巡展”的新产品,专为各行业在数字化创新提供解决方案。数字巡展,立足于设计创新,融合定制化虚拟空间、沉浸化技术体验、数字化企业营销三大核心能力,通过创意和技术优…

把所有圆圈连接起来的游戏_20个幼儿园体育小游戏教程

1、游戏《木头人》游戏规则:幼儿手拉手围成一个圆圈,边走边念儿歌"我是一个木头人,不会说话不会动,看谁坚持一分钟"念到最后一个字时所有幼儿摆出造型不动。老 师说时间到才能动,游戏反复进行。2、游戏《粘泡…

拒绝双写:巧用Lindorm数据订阅

简介: 本文介绍了双写场景的一致性问题,详细介绍了三种解决方案,并针对DB->Binlog->Kafka方案给出了Lindorm数据订阅的最佳实践 双写问题介绍 双写问题(Dual Write Problem)是指:需要同时修改两个独…

春节快到了,来写个烟花动效吧

作者 | Eason来源 | 程序员巴士2022虎年大吉,预祝各位小伙伴们新年快乐,这篇文章教大家如何在 Canvas 中实现高性能的烟花粒子特效,通过使用 Canvas BitmapShader GestureDetector技术栈,实现趣味 2D 春节烟花特效页面&#xff…

商用服务器系统比较好,商用服务器操作系统都用哪种

商用服务器操作系统都用哪种 内容精选换一换切换弹性云服务器操作系统。支持弹性云服务器数据盘不变的情况下,使用新镜像重装系统盘。调用该接口后,系统将卸载系统盘,然后使用新镜像重新创建系统盘,并挂载至弹性云服务器&#xff…

边缘使用 K8s 门槛太高?OpenYurt 这个功能帮你快速搭建集群!

简介: 为了降低 OpenYurt 的使用门槛,帮助更多地开发者快速上手 OpenYurt,社区提供了 OpenYurt 易用性工具 yurtctl。该工具致力于屏蔽 OpenYurt 集群创建的复杂性,帮助开发者在本地快速地搭建 OpenYurt 开发测试集群。 OpenYurt…

Effective Java 在工作中的应用总结

简介: 《Effective Java》是一本经典的 Java 学习宝典,值得每位 Java 开发者阅读。笔者将书中和平日工作较密切的知识点做了部分总结。 作者 | 宜秋 来源 | 阿里技术公众号 《Effective Java》是一本经典的 Java 学习宝典,值得每位 Java 开发…

harfbuzz安装位置 linux_最新Ubuntu 20.04 LTS已发布,在Win10中该如何进行安装和使用?...

最近Ubuntu发布最新的20.04 LTS长期支持版本,官方提供为期5年的更新升级、安全修复等服务。国内的优麒麟团队也同步放出了优麒麟20.04 LTS,加入了全新的UKUI 3.0桌面环境。那么如何在微软的Windows系统中安装体验最新的Ubuntu系统呢?实际上相…

如何查看华为服务器配置信息,查看服务器网络配置信息

查看服务器网络配置信息 内容精选换一换ECS的网卡绑定虚拟IP地址后,该虚拟IP地址无法ping通。以下排查思路根据原因的出现概率进行排序,建议您从高频率原因往低频率原因排查,从而帮助您快速找到问题的原因。如果解决完某个可能原因仍未解决问…

通过Kubernetes监控探索应用架构,发现预期外的流量

简介: Kubernetes 监控立足于应用监控之下的 Kubernetes 容器界面和底层操作系统,是 Kubernetes 集群软件栈端到端可观测性的一体化解决方案,在 Kubernetes 监控中可以同时看到关联的所有层的观测数据。我们希望通过 Kubernetes 监控的一系列…

追踪 Kubernetes 中的网络流量

作者 | Addo Zhang来源 | 云原生指北译者注:这篇文章很全面的罗列出了 Kubernetes 中涉及的网络知识,从 Linux 内核的网络内容,到容器、Kubernetes,一一进行了详细的说明。文章篇幅有点长,不得不说,网络是很…

Go 语言网络库 getty 的那些事

简介: Getty 维护团队不追求无意义的 benchmark 数据,不做无意义的炫技式优化,只根据生产环境需求来进行自身改进。只要维护团队在,Getty 稳定性和性能定会越来越优秀。 个人从事互联网基础架构系统研发十年余,包括我…