Java SE 16 發布

經過六個月的開發,Oracle 發布了 Java SE 16(Java Platform,Standard Edition 16),它使用 OpenJDK 專案作為參考實作。 Java SE 16 保持了與 Java 平台先前版本的向後相容性;所有先前編寫的 Java 專案在新版本下啟動時都將無需更改即可運行。 Java SE 16(JDK、JRE 和 Server JRE)的即用安裝版本專為 Linux(x86_64、AArch64)、Windows 和 macOS 準備。 Java 16 參考實作由 OpenJDK 專案開發,在 GPLv2 許可下完全開源,GNU ClassPath 例外允許與商業產品動態連結。

Java SE 16 被歸類為一般支援版本,並將繼續接收更新,直到下一個版本。長期支援 (LTS) 分支應該是 Java SE 11,它將繼續接收更新直到 2026 年。下一個 LTS 版本計劃於 2021 年 10 月發布。讓我們提醒您,從Java XNUMX發布開始,該專案切換到了新的開發流程,這意味著新版本的形成週期更短。現在,新功能是在一個不斷更新的主分支中開發的,其中包括現成的更改,並且每六個月從該分支分支一次以穩定新版本。

為了準備新版本,開發已從 Mercurial 版本控制系統轉移到 Git 和 GitHub 協作開發平台。此次遷移預計將提高儲存庫操作的效能,提高儲存效率,提供對整個專案歷史記錄中更改的訪問,改進對程式碼審查的支持,並使 API 能夠實現工作流程自動化。此外,Git 和 GitHub 的使用使得該專案對初學者和習慣 Git 的開發人員更具吸引力。

Java 16 的新特性包括:

  • 新增了具有 Vector API 實作的實驗模組 jdk.incubator.vector,該模組提供了在 x86_64 和 AArch64 處理器上使用向量指令執行向量計算的函數,並允許同時將運算應用於多個值 (SIMD)。與 HotSpot JIT 編譯器中提供的標量操作自動向量化功能相比,新 API 可讓您明確控制平行資料處理的向量化。
  • 用 C++ 編寫的 JDK 和 VM HotSpot 程式碼允許使用 C++14 規格中引入的功能。以前,允許使用 C++98/03 標準。
  • ZGC(Z垃圾收集器)以被動模式運行,盡可能減少垃圾收集造成的延遲,增加了並行處理執行緒堆疊的能力,而無需暫停應用程式執行緒。 ZGC現在只有需要暫停的工作,其延遲恆定,通常不超過幾百微秒。
  • 在 SocketChannel、ServerSocketChannel 和 java.nio.channels 類別中新增了對 Unix 套接字 (AF_UNIX) 的支援。
  • 已經使用標準 C 庫 musl 為 Linux 發行版 Alpine 實現了一個端口,該庫在容器、微服務、雲端和嵌入式系統環境中很流行。在此類環境中建議的連接埠可讓您像常規應用程式一樣執行 Java 程式。此外,使用 jlink,您可以刪除所有未使用的模組並創建足以運行應用程式的最小環境,這允許您創建特定於應用程式的緊湊映像。
  • 實作了Elastic Metaspace機制,優化了JVM HotSpot中類元資料(元空間)佔用記憶體的分配和返回操作。使用彈性元空間可以減少記憶體碎片,減少類別載入器開銷,並且由於可以更快地將未使用的類元資料所佔用的記憶體傳回給作業系統,因此對長時間運行的伺服器應用程式的效能也有有益的影響。為了選擇卸載類別後的記憶體釋放模式,提供了選項「-XX:MetaspaceReclaimPolicy=(balanced|aggressive|none)」。
  • 已為在具有基於 AArch64 架構的處理器的硬體上運行的 Windows 系統添加了 JDK 連接埠。
  • 已經提出了外部記憶體存取 API 的第三個預覽版,允許 Java 應用程式透過操作新的 MemorySegment、MemoryAddress 和 MemoryLayout 抽象來安全、有效率地存取 Java 堆外部的記憶體區域。
  • 實驗性的外部連結器 API 已經實現,提供從 Java 到本機程式碼的存取。與外部記憶體 API 一起,新的程式介面使得在傳統共享庫上建立包裝器變得更加容易。
  • 新增了 jpackage 實用程序,它允許您為獨立的 Java 應用程式建立套件。該實用程式基於 JavaFX 的 javapackager,可讓您以各種平臺本機格式建立套件(Windows 為 msi 和 exe,macOS 為 pkg 和 dmg,Linux 為 deb 和 rpm)。這些套件包含所有必需的依賴項。
  • 預設啟用所有 JDK 內部的嚴格封裝,但關鍵 API(例如 sun.misc.Unsafe)除外。 “--illegal-access”選項的值現在預設為“deny”而不是“permit”,這將阻止程式碼存取大多數內部類別、方法和欄位的嘗試。若要繞過限制,請使用“-illegal-access=permit”選項。
  • 「instanceof」運算子中模式匹配的實作已經穩定,這允許您立即定義一個局部變數來引用檢查的值。例如,您可以立即編寫“if (obj instanceof String s && s.length() > 5) {.. s.contains(..) ..}”,而無需明確定義“String s = (String) obj 」。是: if (obj instanceof Group) { Group group = (Group) obj; var 條目 = group.getEntries();現在你可以不用定義「Group group = (Group) obj」: if (obj instanceof Group group) { varentries = group.getEntries(); }
  • 「record」關鍵字的實作已經穩定,為類別定義提供了一種緊湊的形式,在儲存資料的情況下無需明確定義各種低階方法,例如 equals()、hashCode() 和 toString()僅在其不改變的字段中。當類別使用 equals()、hashCode() 和 toString() 方法的標準實作時,它可以不需要它們的明確定義: public record BankTransaction(LocalDate date, double amount, String description) {}

    除了建構函式和 getter 方法之外,此宣告還會自動加入 equals()、hashCode() 和 toString() 方法的實作。

  • 第二個草案是針對密封類別和介面提出的,這些類別和介面不能被其他類別和介面用來繼承、擴展或重寫實作。密封類別還提供了一種比存取修飾符更具聲明性的方法來限制超類別的使用,基於明確列出允許擴展的子類別。包 com.example.geometry;公共密封類別 Shape 允許 com.example.polar.Circle、com.example.quad.Rectangle、com.example.quad.simple.Square {…}

來源: opennet.ru

添加評論