Java 26 正式發布!六個月前我們迎來了 Java 25,現在又到了享受新一波 Java 功能的時刻。這次的更新功能較以往版本少,意味著本次版本的重點是為即將推出的大型功能打下堅實基礎。筆者希望今年晚些時候能看到 Project Valhalla 的首批 JEP 公布,而 Java 26 的多項改動正是為 Valhalla 功能做準備(尤其是 JEP 500 和 529)。
不論未來計劃如何,本文將聚焦本次版本新增的所有功能,簡要介紹每項功能,並在適用時比較與 Java 25 的差異,提供典型使用案例,讓你閱讀後即可開始使用這些新功能。
Java 26 在 HotSpot JVM 引入兩項新功能。HotSpot JVM 是 Oracle 開發的執行引擎,負責將 Java 位元碼轉譯成作業系統處理器架構的機器碼。對於需要快速響應時間的應用(如網頁伺服器或即時系統),尾端延遲(tail latency)是重要指標,可能因垃圾回收暫停或新啟動尚未預熱的 JVM 實例造成。前者可透過低延遲垃圾回收器(如 ZGC)緩解,後者則可利用提前編譯快取(ahead-of-time cache)加速 JVM 啟動。
Java 24 引入了提前編譯快取,透過初始訓練執行將類別讀取、解析、載入與連結後存入記憶體,供後續執行重用以提升啟動速度。但當時快取格式與特定垃圾回收器綁定,無法與 ZGC 等其他回收器相容。JEP 516 擴展快取支援至 ZGC 及其他回收器,改用與 GC 無關的格式快取 Java 物件。
每種垃圾回收器對物件記憶體配置有不同策略,導致快取物件的記憶體位址無法跨回收器使用。JEP 516 透過將記憶體位址替換為邏輯索引解決此問題,快取載入時再將邏輯索引轉回記憶體位址並實體化物件。若訓練時使用 ZGC 或 -XX:-UseCompressedOops,JVM 會自動使用新格式快取;若使用 -XX:+UseCompressedOops,則使用舊格式。可透過 -XX:+AOTStreamableObjects 強制使用新格式。
G1 GC 自 Java 9 起為預設垃圾回收器,設計目標為高效能與低暫停時間,透過與應用程式執行緒並行工作達成延遲與吞吐量平衡。G1 透過卡片表(card table)追蹤物件參考更新,寫屏障(write barrier)代碼會同步更新卡片表,導致同步開銷增加,影響效能。
JEP 522 提出引入第二張卡片表,讓優化執行緒與應用執行緒分別更新不同卡片表,減少同步需求。當掃描卡片表可能超過暫停目標時,G1 原子切換兩張卡片表,應用執行緒繼續寫入空白卡片表,優化執行緒處理已填滿卡片表。此方法可提升 5-15% 吞吐量,且簡化寫屏障代碼,在 x64 架構下額外提升約 5% 吞吐量。兩張卡片表大小相同,約佔 Java 堆記憶體的 0.2%,約每 GB 堆空間佔 2MB 原生記憶體,效能提升遠超過記憶體開銷。
Java 26 在核心函式庫中新增一項功能:HTTP 客戶端 API 現支援 HTTP/3。自 Java 11 起,Java 平台提供現代 HTTP 客戶端 API,支援 HTTP/1.1 與 HTTP/2,預設使用 HTTP/2,若伺服器不支援則回退至 HTTP/1.1。HTTP/3 於 2022 年由 IETF 標準化,基於 QUIC 傳輸協定,提供多工、快速握手、避免網路擁塞及更可靠傳輸等優勢,已被大多數瀏覽器支援,約三分之一網站受益。
Java 26 需明確選擇 HTTP/3,透過 HttpClient 或 HttpRequest 設定 HTTP_3 版本。若伺服器不支援,會自動回退至 HTTP/2 或 HTTP/1.1。由於 HTTP/3 基於 UDP,無法從現有 TCP 連線升級,API 提供四種協商方式:優先嘗試 HTTP/3,逾時回退;同時開啟 HTTP/3 與舊協定連線,先成功者使用;先用 HTTP/2 或 HTTP/1.1,若伺服器回應支援 HTTP/3 則切換;僅用 HTTP/3,伺服器不支援即失敗。由於 HTTP/3 部署尚未普及,暫不設為預設。
Java 26 重新預覽先前版本引入的功能,如 PEM 格式編碼解碼 API(JEP 524),簡化 PEM 格式的加密物件處理。此功能仍為預覽,需要啟用預覽標誌。
結構化併發(JEP 525)改善 Java 併發模型,讓執行緒具備階層結構與作用域,類似函式呼叫樹狀結構,方便錯誤與取消訊息傳遞。示例中,結構化併發確保子任務失敗時取消其他任務,並自動傳播取消訊號。此功能仍為預覽。
延遲常數(JEP 526)引入 LazyConstant 類型,支援延遲初始化且不可變物件,結合 final 欄位優化啟動時間與執行效率。可用於延遲初始化日誌器、控制器等元件,並支援延遲清單與映射。
向量 API(JEP 529)持續孵化,支援在 Java 中撰寫高效向量運算,利用 CPU SIMD 指令提升性能,適用於機器學習、線性代數、加密等領域。
模式匹配擴展(JEP 530)第四次預覽,支援原始型別模式匹配,允許在 instanceof 與 switch 中使用原始型別,提升語法一致性與安全性。
Java 26 廢除 Applet API(JEP 504),因安全性與現代網頁技術興起,瀏覽器已不再支援 Java Applet,且安全管理器已於 Java 24 停用,Applets 已無法正常運作,移除不會對現有應用造成重大影響。
此外,Java 26 針對深度反射修改 final 欄位的行為提出警告(JEP 500),未來將限制此類操作以提升程式安全性與效能,僅序列化庫可透過特定 API 例外使用。
總結來說,Java 26 以穩固基礎為主軸,優化垃圾回收、網路協定支援、併發模型與延遲初始化,並逐步淘汰過時技術,為未來大型功能鋪路。這個版本已準備好迎接更多創新,值得開發者立即體驗。