Java SE 22 平台與 OpenJDK 22 開放參考實作的發布

經過六個月的開發,Oracle 發布了 Java SE 22(Java Platform, Standard Edition 22)平台,該平台使用 OpenJDK 開源項目作為參考實現。 除了刪除了一些已棄用的功能外,Java SE 22 保持與以前版本的 Java 平台的向後兼容性——大多數以前編寫的 Java 項目在新版本下運行時仍無需修改即可運行。 Java SE 22(JDK、JRE 和 Server JRE)的可安裝版本已為 Linux(x86_64、AArch64)、Windows(x86_64)和 macOS(x86_64、AArch64)準備。 Java 22 參考實現由 OpenJDK 項目開發,在 GPLv2 許可下完全開源,具有 GNU ClassPath 例外,允許動態鏈接到商業產品。

Java SE 22 被歸類為常規支援版本,並將繼續接收更新,直到下一個版本。長期支援 (LTS) 分支應該是 Java SE 21 或 Java SE 17,它們將分別在 2031 年和 2029 年之前收到更新(通常在 2028 年和 2026 年之前可用)。對 Java SE 11 LTS 分支的公開支援已於去年 2032 月結束,但擴展支援將持續到 8 年。對 Java SE 2030 LTS 分支的擴展支援將持續到 XNUMX 年。

讓我們提醒您,從Java 10發布開始,該專案切換到了新的開發流程,這意味著新版本的形成週期更短。現在,新功能是在一個不斷更新的主分支中開發的,其中包括現成的更改,並且每六個月從該分支分支一次以穩定新版本。

Java 22 的新特性包括:

  • G1 垃圾收集器支援區域固定,它允許您暫時固定 Java 物件在記憶體中的位置,以避免它們被垃圾收集器移動,並允許對這些物件的引用在 Java 和本機程式碼之間安全傳遞。固定可讓您在使用本機程式碼執行 JNI(Java 本機介面)的關鍵區域時減少延遲並避免停用垃圾收集(在執行這些部分時,JVM 不應移動與其關聯的關鍵對象,以避免競爭條件)。固定會從垃圾收集器的視野中刪除關鍵對象,垃圾收集器可以繼續清理未固定的區域。
  • 新增了一個初步功能,允許在呼叫super(...) 之前在建構函式中指定表達式,如果這些表達式不引用建構函式建立的實例,則用於從繼承類別建構子明確呼叫父類構造函數。類別外部 { void hello() { System.out.println("Hello"); } 類別內部 { 內部() { 你好();極好的(); } } }
  • FFM(外部函數和記憶體)API 已經穩定,允許 Java 程式透過呼叫外部函式庫的函數並存取 JVM 外部的記憶體來與外部程式碼和資料進行交互,而無需求助於使用 JNI(Java 本機介面)。
  • 已啟用對未命名變數和模式匹配的支援 - 現在您可以指定“_”字符,而不是調用時未使用但必需的變數和模式。 // was String pageName = switch (page) { case GitHubIssuePage(var url, var content, var links, int issuesNumber) -> “ISSUE #” + issuesNumber; ... }; // 現在你可以 String pageName = switch (page) { case GitHubIssuePage(_, _, _, int issuesNumber) -> “ISSUE #” + issuesNumber; };
  • 提出了 Class-File API 的初步實現,用於解析、產生和轉換 Java 類別檔案。 ClassFile cf = ClassFile.of(); ClassModel classModel = cf.parse(bytes); byte[] newBytes = cf.build(classModel.thisClass().asSymbol(), classBuilder -> { for (ClassElement ce : classModel) { if (!(ce instanceof MethodModel mm && mm.methodName().stringValue(). startsWith("debug"))) { classBuilder.with(ce); } } });
  • java 實用程式提供了運行以多個程式碼檔案或預先編譯類別庫的形式提供的 Java 程式的能力,無需單獨編譯這些文件,也無需配置建置系統。新功能使得運行將不同類別的程式碼分為單獨檔案的程式變得更加容易。 Prog.java: class Prog { public static void main(String[] args) { Helper.run(); } Helper.java: class Helper { static void run() { System.out.println("Hello!"); } }

    例如,要執行由兩個檔案「Prog.java」和「Helper.java」組成的程序,現在執行「java Prog.java」就足夠了,它將編譯 Prog 類,定義對 Helper 類別的引用,找到並編譯Helper檔.java並呼叫main方法。

  • 新增了字串模板的第二個初步實現,除了字串文字和文字塊之外還實現了。字串模板可讓您將文字與計算表達式和變數組合在一起,而無需使用 + 運算子。表達式的替換是使用替換 \{..} 進行的,並且可以連接特殊的處理程序來檢查替換值的正確性。例如,SQL 引擎檢查被替換到 SQL 程式碼中的值並傳回 java.sql.Statement 物件作為輸出,而 JSON 處理器監視 JSON 取代的正確性並傳回 JsonNode。字串查詢 =“SELECT * FROM Person p WHERE p.” + 屬性 + " = '" + 值 + "'"; // was 語句查詢 = SQL."""SELECT * FROM Person p WHERE p.\{property} = '\{value}'"""; // 變成
  • 新增了向量 API 的第七個預覽版,提供了在 x86_64 和 AArch64 處理器上使用向量指令執行向量計算的函數,並允許同時將運算應用於多個值 (SIMD)。與 HotSpot JIT 編譯器中提供的標量操作自動向量化功能不同,新 API 可以明確控制平行資料處理的向量化。
  • 新增了擴展 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]]
  • 結構化並發實驗性 API 的第二個版本已被提議進行測試,該版本透過將不同執行緒中執行的多個任務作為單一區塊處理來簡化多執行緒應用程式的開發。
  • 新增了隱式聲明的類別和「main」方法的未命名實例的第二個初步實現,它可以省去公共/靜態聲明、傳遞參數數組以及與類別聲明關聯的其他實體。 // 是 public class HelloWorld { public static void main(String[] args) { System.out.println("Hello world!"); } } // 現在你可以 void main() { System.out.println("Hello, World!"); }
  • 新增了 Scoped Values 的第二個預覽實現,允許跨執行緒共享不可變資料以及在子執行緒之間有效交換資料(值是繼承的)。正在開發 Scoped Values 來取代線程局部變數機制,並且在使用大量虛擬線程(數千或數百萬線程)時效率更高。作用域值和執行緒局部變數之間的主要區別在於,前者只寫入一次,以後不能更改,並且僅在執行緒執行期間保持可用。
  • 並行垃圾收集器在處理大型物件數組時提高了效能。透過最佳化,在一些具有大型物件數組的測試中,可以將開始搜尋物件之前的延遲減少 20%。

此外,您還可以注意到發布了用於使用圖形介面 JavaFX 22 建立應用程式的平台更新。

來源: opennet.ru

添加評論