技術

Java 27 移除凍結應用程式的GC,物件記憶體減少 33%

Adrian Kessler
在 Google 中新增我們

Java 27 帶來了兩項變更,將悄然影響所有在各地運行的 JVM。G1 垃圾收集器現在是所有 Java 執行環境的預設選項——終結了在資源受限硬體上仍使用 Stop-the-World Serial 收集器的情況——而物件標頭已從 96 位元縮減至 64 位元,對於任何建立大量物件的應用程式而言,開銷減少了三分之一。

Serial 收集器是 Java 最古老的 GC:簡單、可預測,但也很殘酷。當它執行時,會凍結整個應用程式,直到堆積清理完畢。在大記憶體、多 CPU 的伺服器上,這種取捨早在多年前就已無法維持——從 Java 9 開始,G1 取代 Serial 成為伺服器預設的收集器。受限環境則一直透過 Java 26 繼續使用 Serial:單 CPU 機器、小型雲端 VM、低記憶體嵌入式系統。這個預設值在 Java 27 中結束。

G1 將堆積劃分為多個小區域,並增量收集,優先處理垃圾最多的區域——因此得名 Garbage-First。暫停仍然存在,但比 Serial 的完整收集更短、更可預測。Oracle 表示,G1 現在在所有堆積大小下都與 Serial 具有競爭力。對於在可用的最便宜雲端實例(一個 CPU、1 GB RAM)上部署應用程式的開發人員來說,Java 27 消除了他們多年來一直忍受的摩擦。

緊湊物件標頭變更是此版本的另一半。Java 物件攜帶中繼資料——型別資訊、雜湊碼、鎖定狀態——儲存在附加於每個物件的標頭中。舊格式使用 96 位元。Java 27 將其壓縮至 64 位元,每個物件減少 33%。對於建立數百萬個物件的應用程式——訊息佇列、金融帳本、事件驅動的微服務——累積效應是可衡量的:更密集的堆積、更好的 CPU 快取利用率、更少的收集週期。

這兩項變更都有注意事項。專門針對 Serial GC 行為調整的應用程式在升級後可能會出現意想不到的計時差異。G1 用於簿記的記憶體比 Serial 多,這在記憶體預算真正緊張的環境中很重要——儘管 Oracle 測試表明,對於大多數工作負載,吞吐量取捨可以忽略不計。在受限系統上部署 Java 27 的開發團隊應在發佈前針對新預設值進行測試。過渡是自動的,但並非不可見。

Java 27 也為 TLS 1.3 新增了後量子混合金鑰交換,在現有的 X25519 橢圓曲線交換之外實作了 ML-KEM 演算法。今天協商的 TLS 連線理論上可能被未來的量子電腦擷取並稍後解密。混合金鑰交換透過要求攻擊者同時破解經典和後量子演算法來防禦這種情況——對於任何處理敏感資料的 Java 服務來說,這都是一項有意義的補充。

Java 27 於 2026 年 9 月 15 日發佈,遵循該平台的六個月節奏。結構化並行和延遲常數在此版本中繼續作為預覽功能。Java 系列的下一個長期支援版本預計在 2027 年推出。

標籤: , , , , ,

在 Google 中新增我們

討論

共有 0 則留言。