經過六個月的開發,Oracle 發布了 Java SE 24(Java 平台標準版 24),它以開源 OpenJDK 專案作為參考實作。除了移除一些已棄用的功能外,Java SE 24 保持了與 Java 平台先前版本的向後相容性——大多數先前編寫的 Java 專案在新版本下運行時無需任何修改。 Java SE 24(JDK、JRE 和 Server JRE)的即用型建置版本已準備就緒。 Linux (x86_64,AArch64), Windows (x86_64)和 macOS (x86_64, AArch64)。 Java SE 24 參考實作由 OpenJDK 專案開發,完全開源,採用 GPLv2 許可證,並帶有 GNU ClassPath 例外,允許與商業產品進行動態連結。
Java SE 24 被歸類為常規支援版本,其中的更新將發佈至下一個版本。長期支援 (LTS) 分支應該是 Java SE 21 或 Java SE 17,它們將分別獲得更新直到 2031 年和 2029 年(通常可用到 2028 年和 2026 年)。 Java SE 8 LTS 分支的擴展支援將持續到 2030 年,Java SE 11 將持續到 2032 年。下一個 LTS 版本將是 Java SE 25 的秋季版本。
Java SE 提出的 24 項創新包括:
- 提出了一種 Shenandoah 垃圾收集器的實驗性生成操作模式,該模式分別處理舊的和最近創建的對象,以提高清理短壽命對象的效率。新模式提供了更可預測的吞吐量、對負載變化的彈性以及垃圾收集期間減少的記憶體消耗。 Shenandoah 調度程式旨在透過與 Java 應用程式執行並行執行更多工作來減少垃圾收集停機時間。
- HotSpot JVM 實現了對緊湊物件頭的實驗性支持,在 64 位元系統上,緊湊物件頭的大小從 96 位元減少到 64 位元(12 到 8 位元組)。減少標頭的大小可以減少堆大小並提高快取效率。
- G1 垃圾收集器簡化了監視應用程式記憶體存取的屏障的實作。在新版本中,屏障擴充操作已移至 C2 JIT 中的後期編譯階段。測試表明,這種傳輸可以將 C2 JIT 編譯器的開銷降低 10-20%,具體取決於應用程式。
- 新增了使用加密金鑰派生函數 (KDF) 的 API,該 API 允許根據金鑰(例如密碼)和任意一組資料產生所需長度的附加金鑰。 KDF API 目前處於預覽狀態。
- 增加了預先(Ahead-of-Time)載入和連結類別的能力。透過提供已載入和連結的應用程式中使用的類,此項目變更允許 HotSpot JVM 啟動得更快。當應用程式首次啟動時,所有類別的狀態都會刷新到快取中,並用於加快後續啟動時的載入速度。
- 新增了用於解析、產生和轉換 Java 類別檔案的 Class-File API。
ClassFile cf = ClassFile.of();類別模型 classModel = cf.parse(bytes); byte[] newBytes = cf.build(classModel.thisClass().asSymbol(), classBuilder -> { for (ClassElement ce : classModel) { if (!(ce instanceof MethodModel mm && mm.methodName().string}().
- 新增了擴展的 Stream API,支援定義您自己的中間操作,這在現有內建中間操作不足以滿足所需資料轉換的情況下非常有用。自訂處理程序使用新的中間操作 Stream::gather(Gatherer) 附加,該操作透過將使用者指定的處理程序應用於流的元素來處理它們。 jshell> Stream.of(1,2,3,4,5,6,7,8,9).gather(new WindowFixed(3)).toList() $1 ==> [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
- 提出了 Scoped Values 的第四個初步實現,允許跨線程共享不可變數據,並在子線程之間進行高效的數據交換(值是繼承的)。 Scoped Values 正在發展以取代線程局部變數機制,並且在使用非常大量的虛擬線程(數千和數百萬個線程)時效率更高。 Scoped Values 與線程局部變數的主要區別在於,前者只寫入一次,之後無法更改,並且僅在線程執行期間保持可用。
- 模式匹配引擎已更新,包括對所有模板類型、instanceof 運算子和 switch 區塊中使用原始類型(int、byte、char 和其他基本非物件類型)的初步支援。開關(x.getStatus()){case 0->“好的”;情況 1 -> «警告»;情況 2 -> «錯誤»; case int i -> "未知狀態: " + i; } if (i instanceof byte b) { … b … }
- 這是 Vector API 的第九個草案,它提供了使用 x86_64 和 AArch64 處理器的向量指令執行向量計算的函數,並允許一次將運算應用於多個值(SIMD)。與 HotSpot JIT 編譯器對標量運算的自動向量化不同,新 API 提供了明確控制平行資料處理向量化的能力。
- 實現了對同步虛擬線程的支持,而無需將它們固定到與平台相關的線程。處於阻塞狀態的同步方法或表達式中的虛擬線程現在釋放其平台線程,允許其他虛擬線程使用它,從而顯著增加可用虛擬線程的數量並提高使用多線程的應用程式的可擴展性。
- 新增了功能的第三稿,允許建構函數在呼叫 super(…) 之前指定表達式,以便從衍生類別建構函數明確呼叫父類別建構函數,只要這些表達式不引用建構子正在建立的實例。類別外部 { void hello() { System.out.println("你好"); } 類別 Inner { Inner() { 你好();極好的(); } } }
- jlink 實用程式實現了無需使用 JMOD 檔案建立執行時間映像的支持,這可以將 JDK 的大小減少約 25%。
- 新增了第二個草案,使用單一「import module M」語句一次導入指定模組導出的所有套件。這項變更允許包含庫和類,而無需指定它們在包層次結構中的位置,從而使重用模組化庫變得更加容易。例如,指定「import module java.base」將導入 java.base 模組中包含的所有 54 個套件,而以前必須單獨提及這些套件(「import java.io.*」、「import java.util.*」等)。
- 新增了隱式聲明的類別和「main」方法的未命名實例的第四個初步實現,它可以不用公共/靜態聲明,傳遞參數數組和與類別聲明相關的其他實體。 // 是公用類別 HelloWorld { public static void main(String[] args) { System.out.println(«Hello world!»); } } // 現在您可以 void main() { System.out.println(«Hello, World!»); }
- 結構化並發 API 的第四稿現已可供測試,它透過將在不同執行緒上執行的多個任務視為一個單元來簡化多執行緒應用程式的開發。
- KeyPairGenerator、Signature 和 KeyFactory API 現在支援 ML-KEM(CRYSTALS-Kyber)和 ML-DSA(CRYSTALS-Dilithium)演算法,這些演算法由美國國家標準與技術研究所 (NIST) 標準化,並且可以抵抗量子電腦上的暴力破解。這些演算法採用基於解決格論問題的加密方法,其解決時間在傳統電腦和量子電腦上相同。
- 在 ZGC 垃圾收集器中,已刪除對非生成操作模式(不區分「舊」物件和「年輕」物件的處理)的支援。從 Java SE 23 開始,ZGC 的生成模式是預設模式。
- 新增了使用 JNI(Java 本機介面)和 FFM(外部函數和記憶體)API 的警告,以便開發人員為 API 資料的受限存取做好準備,因為未來版本將包含完整性模式,預設禁止與本機程式碼的互動。
- 使用 sun.misc.Unsafe 類別提供的外部記憶體存取方法(JVM 之外)時啟用警告輸出。要存取堆外記憶體並與外部程式碼交互,建議使用 VarHandle API。在先前的版本中,對 sun.misc.Unsafe 的支援已被棄用。
- 已停用安全管理器,該管理器早已失去其相關性,並且在瀏覽器插件支援結束後變得無人認領。安全管理器已在 Java 17 中棄用。
- 移除了支援 32 位元作業系統平台的程式碼 Windows 在 x86 系統上。適用於 32 位元 x86 系統的 Java 移植版本已被棄用,並計劃移除(將停止支援)。 Linux 在 32 位元 x86 系統上)。
此外,我們還可以注意到,用於建立具有圖形介面 JavaFX 24 的應用程式平台的更新已經發布,以及通用虛擬機器 GraalVM 的新版本,它支援以 JavaScript(Node.js)、Python、Ruby、R、任何適用於 JVM 的語言(Java、Scala、Clojure、Kotlin)以及可以產生 LLVM 位元碼的語言(RustC、Rust)。除了支援 JDK 24 之外,新版 GraalVM 還包括針對機器學習任務的最佳化、改進了將 Java 字節碼編譯為機器碼的支持,以及 SkipFlow 機制以減小可執行檔的大小並減少編譯時間。
來源: opennet.ru
