簡介: 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的開源參考實現,由
安裝包下載
主要分為OpenJDK版本和Oracle版本,下載地址如下:
- OpenJDK版本:
- Oracle版本:
上述版本,如果是個人學習用途,則差異不大。但如果是用於商業用途,則需要仔細看好相關的授權。Oracle JDK根據二進制代碼許可協議獲得許可,而OpenJDK根據GPL v2許可獲得許可。
更多有關Java的基本知識,可以參閱《
JDK 17 新特性說明
JEP 406:switch的模式匹配(預覽)(JDK-8213076)
specification
通過switch表達式和語句的模式匹配,以及模式語言的擴展,增強Java編程語言。將模式匹配擴展到switch允許對表達式進行測試,每個模式都有特定的操作,以便可以簡潔而安全地表達復雜的面向數據的查詢。
有關更多詳細信息,請參見
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棄用,但仍然可用和支持。
要啟用金屬,應用程序應通過設置系統屬性指定其使用:
Metal或OpenGL的使用對應用程序是透明的,因為這是內部實現的區別,對Java API沒有影響。Metal管道需要macOS 10.14.x或更高版本。在早期版本上設置它的嘗試將被忽略。
有關更多詳細信息,請參見[JEP 382(
大圖標訪問新API(JDK-8182043)
client-libs/javax.swing
JDK 17中提供了一個新的方法javax.swing.filechooser.FileSystemView.getSystemIcon(File, int, int)
,該方法允許在可能的情況下訪問更高質量的圖標。它已為Windows平台完全實施;但是,其他平台上的結果可能會有所不同,稍后將增強。例如,通過使用以下代碼:
用戶可以為“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的工作原理和以前一樣,盡管它的大多數方法都被棄用了。
有關此變更理由的更多信息,請查看
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的詳細信息,請參見
“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的脆弱性和危險。
有關更多詳細信息,請參閱
控制台字符集API(JDK-8264208)
core-libs
java.io.Console已更新,以定義一個新方法,該方法返回控制台的Charset。返回的Charset可能與Charset.defaultCharset()方法返回的Charset不同。例如,它返回IBM437,而Charset.defaultCharset()在Windows (en-US)上返回windows-1252。請參閱
用於反序列化的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。請參閱
添加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的計算機上編譯。
有關更多詳細信息,請參見
統一日志支持異步日志刷新(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”包(即,包是子包的包)
- 同級包(即具有相同父包的其他包)
- 任何子包
相關軟件包不一定都在同一個模塊中。
原文鏈接
本文為阿里雲原創內容,未經允許不得轉載。