JDK 24:Java 24 中的新特性

banq發表於2024-11-15

Java 的下一個版本提出了 12 個功能,包括緊湊標頭、模式中的原始型別、instanceof 和 switch,以及無需 JMOD 即可連結執行時映象。

繼9 月 17 日釋出Java 開發工具包 (JDK) 23之後,計劃中的後續版本JDK 24 的開發工作仍在繼續,目前已提出 17 個功能。最新的五個功能包括刪除 32 位 x86 埠、同步虛擬執行緒而不進行固定、簡單的原始檔和例項主方法、永久禁用安全管理器以及模組匯入宣告。

先前提出的功能包括緊湊標頭的實驗版本;模式中的原始型別、instanceof和switch;無需 JMOD 即可連結執行時影像;分代 Shenandoah 垃圾收集器;範圍值;金鑰派生函式 API;刪除 Z 垃圾收集器中的非分代模式;流收集器;向量 API;類檔案 API;警告以便開發人員為未來使用 JNI(Java 本機介面)的限制做好準備;以及 G1 垃圾收集器的後期屏障擴充套件。

JDK 24 將於 2025 年 3 月 18 日到期,已被指定為非長期支援 (LTS) 版本。與 JDK 23 一樣,JDK 24 也將僅獲得 Oracle 六個月的Premier 級支援。JDK 24 的早期訪問版本可在jdk.java.net上找到。 

新特性:

  • Windows 32 位 x86 埠已在 JDK 21 中棄用並刪除,目的是在未來版本中將其刪除。計劃最終刪除對 Windows 32 位 x86 埠的原始碼和構建支援。JDK 24 將更新構建系統,以便在嘗試配置 Windows 32 位 x86 (x86-32) 構建時發出錯誤訊息。該錯誤訊息將透過新的配置選項來抑制。埠和相關的埠特定功能將在相關文件中標記為棄用並刪除。
  • 同步虛擬執行緒而不固定:涉及提高使用同步方法和語句的 Java 程式碼的可擴充套件性,方法是安排在此類構造中阻塞的虛擬執行緒釋放其底層平臺以供其他執行緒使用。這將消除幾乎所有虛擬執行緒被固定到平臺執行緒的情況,這嚴重限制了可用於處理應用程式工作負載的虛擬執行緒數量。
  • 簡單原始檔和例項主方法:第四個預覽將改進 Java 語言,以便初學者可以編寫他們的第一個程式,而無需瞭解為大型程式設計的語言功能。該功能之前已在JDK 21、JDK 22和JDK 23中預覽過。將採用新術語和修訂後的標題,但該功能其他方面保持不變。它以前被稱為隱式宣告的類和例項主方法。
  • 永久禁用安全管理器:需要修改 Java 平臺規範,以便開發人員無法啟用安全管理器,而其他平臺類則不會引用它。提案指出,多年來,安全管理器一直不是保護客戶端 Java 程式碼的主要手段,很少用於保護伺服器端程式碼,而且維護成本高昂。安全管理器已在 Java 17 中被棄用並被刪除。
  • 緊湊物件頭:會將 HotSpot VM 中的物件頭大小從 96 到 128 位減少到 64 位架構上的 64 位。提議的功能的目標是減少堆大小、提高部署密度並增加資料區域性性。
  • 模組匯入宣告:(之前已在 JDK 23 中預覽)增強了 Java 程式語言,使其能夠簡潔地匯入模組匯出的所有包。這簡化了模組庫的重用,但不需要將程式碼匯入為模組本身。
  • JDK 24 中模式、 instanceof和switch中原始型別的第二個預覽 將透過允許所有模式和上下文中的原始型別來增強模式匹配。該功能還將擴充套件instanceof和switch以適用於所有原始型別。該功能的目標包括透過允許所有型別(無論是原始型別還是引用型別)的型別模式來實現統一的資料探索;將型別與instanceof對齊並將instanceof與安全轉換對齊;並允許模式匹配在巢狀和頂級模式上下文中使用原始型別。此功能之前已在 JDK 23 中預覽過。
  • 其他目標包括提供易於使用的構造,消除由於不安全的強制型別轉換而丟失資訊的風險,遵循 Java 5 和 Java 7 中對switch的增強,並允許switch處理任何原始型別的值。

透過連結不使用 JMOD 的執行時映像,計劃透過啟用jlink工具來建立不使用 JDK JMOD檔案的自定義執行時映像,將 JDK 的大小減少約 25%。此功能必須預設啟用,某些 JDK 供應商可能選擇不啟用它。目標包括允許使用者從模組連結執行時映像,而不管這些模組是獨立的 JMOD 檔案、模組化 JAR 檔案還是先前連結的執行時映像的一部分。提出該提案的動機是,在雲環境中,檔案系統上安裝的 JDK 的大小非常重要,因為包含已安裝 JDK 的容器映像會透過網路自動且頻繁地從容器登錄檔複製。減小 JDK 的大小將提高這些操作的效率。

分代 Shenandoah將透過實驗性的分代收集功能增強垃圾收集器,以提高可持續吞吐量、負載峰值抵抗力和記憶體利用率。主要目標是提供一種實驗性的分代模式,而不會破壞非分代 Shenandoah。分代模式旨在成為未來版本中的預設模式。

範圍值使方法能夠與執行緒內的呼叫方和子執行緒共享不可變資料。範圍值比本地執行緒變數更容易推理。它們還具有較低的空間和時間成本,特別是與虛擬執行緒和結構化併發一起使用時。範圍值 API 是在JDK 20中提出的孵化版,在JDK 21中提出的預覽版,並針對JDK 22和JDK 23進行了改進和完善。範圍值將在 JDK 24 中預覽。

藉助金鑰派生函式 (KDF) API,將引入用於金鑰派生函式的 API,這些函式是用於從金鑰和其他資料派生其他金鑰的加密演算法。此提案的目標是允許安全提供商以 Java 程式碼或本機程式碼實現 KDF 演算法。另一個目標是使應用程式能夠使用 KDF 演算法,例如基於 HMAC(雜湊訊息認證碼)的提取和擴充套件金鑰派生函式 ( RFC 5869 ) 和 Argon2 ( RFC 9106 )。

刪除 Z 垃圾收集器 (ZGC) 的非分代模式是一項旨在降低支援兩種不同模式的維護成本的提案。該提案指出,維護非分代 ZGC 會減慢新功能的開發速度,而對於大多數用例而言,分代 ZGC 應該是比非分代 ZGC 更好的解決方案。後者最終應該被前者取代,以降低長期維護成本。該計劃要求透過淘汰該選項ZGenerational並刪除非分代 ZGC 程式碼及其測試來刪除非分代模式。非分代模式將在未來的版本中過期,屆時它將不會被 HotSpot JVM 識別,從而拒絕啟動。

流收集器將增強流 API,以支援自定義中間操作。流收集器允許流管道以現有內建中間操作無法輕易實現的方式轉換資料。此功能在JDK 22和JDK 23中作為預覽版提出。該 API 將在 JDK 24 中最終確定。目標包括使流管道更加靈活和富有表現力,並允許自定義中間操作來操作無限大小的流。

向量API旨在表達向量通訊,這些通訊在執行時可靠地編譯為受支援的 CPU 架構上的最佳向量指令,從而實現優於等效標量計算的效能。向量 API 之前在JDK 16到JDK 23中孵化。它將在 JDK 24 中重新孵化,沒有任何 API 變化,也沒有相對於 JDK 23 的實質性實現。該提案的目標包括用與平臺無關的 API 清晰簡潔地表達各種向量計算,在 x64 和 AArch54 架構上提供可靠的執行時編譯和效能,當無法在執行時表達向量計算時可以優雅地降級並仍然執行,並與Project Valhalla保持一致,利用對 Java 物件模型的增強功能。

之前在 JDK 22 和 JDK 23 中預覽過的類檔案 API將 在 JDK 24 中最終確定,但會略有改動。此 API 提供了一個用於解析、生成和轉換 Java 類檔案的標準 API。其目的是提供一個用於處理類檔案的 API,該 API 跟蹤 Java 虛擬機器規範定義的類檔案格式。第二個目標是使 JDK 元件能夠遷移到標準 API,並最終刪除 JDK 內部的第三方ASM 庫副本。 自第二個預覽版以來的更改 包括重新命名列舉值、刪除某些欄位、新增方法和方法過載、重新命名方法以及刪除被認為不必要的介面和方法。

G1 垃圾收集器的後期屏障擴充套件旨在簡化 G1 屏障的實現。G1 垃圾收集器的屏障透過將其擴充套件從 C2 編譯管道的早期移到後期來記錄有關應用程式記憶體訪問的資訊。目標包括減少使用 G1 收集器時 C2 編譯的執行時間,使對 C2 缺乏深入瞭解的 HotSpot 開發人員能夠理解 G1 屏障,並確保 C2 保留有關記憶體訪問、安全點和屏障的相對順序的不變數。第四個功能是保留 C2 生成的 JIT(即時)編譯程式碼的質量(速度和大小)。

第一個針對 JDK 24 的功能,正式名稱為“準備限制使用 JNI ”,要求發出有關使用 JNI 的警告,並調整JDK 22中的外部函式和記憶體 (FFM) API ,以一致的方式發出警告。這些警告旨在為未來版本做準備,透過統一限制 JNI 和 FFM API,預設確保完整性。該計劃的目標包括將 JNI 保留為與本機程式碼互操作的標準方式,為預設不允許與本機程式碼互操作的未來版本準備 Java 生態系統,並協調 JNI 和 FFM API 的使用,以便庫維護者可以從一個遷移到另一個,而無需開發人員更改命令列選項。

針對 JDK 24 的其他功能將在未來幾個月內確定。潛在的 Java 24 功能包括 JDK 23 中預覽的功能的進一步預覽或最終版本。這些功能包括簡化併發程式設計的結構化併發靈活的建構函式主體,這為開發人員提供了更大的自由來表達建構函式的行為。

提前類載入(Ahead-of-time class loading)是一項旨在加速 Java 啟動的功能,而字串模板(string templates)是一項在 JDK 21 和JDK 22中預覽過但從 JDK 23 中刪除的功能,也可能會在 JDK 24 中推出。

最新的 LTS 版本JDK 21於 2023 年 9 月釋出,預計將獲得 Oracle 至少五年的 Premier 支援。下一個 LTS 版本 JDK 25 將於 2025 年 9 月釋出。LTS版本主導了 Java 的採用,這意味著在使用者等待 JDK 25 時,JDK 23 和 JDK 24 的採用率可能會較低。

相關文章