隨著垃圾回收機制的持續演進,效能優化一直是項重要的焦點。Java 24 的重要提案 JEP 490 將 Z 垃圾回收器(ZGC)完全轉向分代模式,並捨棄原有的未分代模式。這項提案主要著重在簡化 ZGC 的維護工作,並為未來的功能開發鋪路。
目錄
前言
ZGC 全名是 Z Garbage Collector,它是 Java 虛擬機器中一種新型的垃圾回收器,目的是為了實現低延遲和高擴展的垃圾收集器。首先在 JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental) 中於 JDK 11 時以實驗性質的方式導入,之後在 JDK 13(JEP 351)和 JDK 14(JEP 364、JEP 365)中陸續有新功能加入,並且在 JDK 15(JEP 377)時正式成為可正式使用的產品功能。
它具有下列優點:
- 低延遲:在垃圾回收的過程中幾乎不影響應用程式的運行
- 高擴展:可以處理非常大量的記憶體
- 並行處理:大部分的垃圾回收工作都是在後台進行的,不會阻塞應用程式的執行緒
- 自動優化:會根據應用程式和硬體環境去自動調整垃圾回收的設定
導入分代模式後
在 JDK 21 時加入了 JEP 439 ZGC 分代模式之後,同時維護兩套不同的垃圾回收模式成為 OpenJDK 開發團隊的重大負擔。目前的 ZGC 支援分代與未分代兩種模式,這種雙軌並行的架構造成了開發資源的分散,也減緩了新功能的開發進程。
根據開發團隊的觀察,分代 ZGC 在大多數使用情境下都能提供更好的效能表現。而維護兩種模式不僅增加了系統的複雜度,也讓開發團隊必須在新功能開發時同時考慮兩種模式的相容性。
為了降低維護成本,並在考慮了大多數的使用情境後,已經在 JDK 23 的 JEP 474 中將分代模式設定成預設啟動。
接著在本版中,開發團隊決定採取更加積極的作法,透過移除未分代模式來簡化整體架構,讓開發資源能夠更有效地運用在效能改進與新功能開發上。
JEP 490 概觀
本功能主要是移除上一版中標記為已棄用的 ZGC 未分代模式,並維持 ZGC 的預設模式為分代模式。目標是減少兩種不同模式的維護成本。
維護未分代模式已經減緩了一些新功能的開發,在 JEP 439:分代 ZGC 中提到:
分代 ZGC 對於大多數的情況來說,應該是一個比未分代 ZGC 還要更好的解決方案。我們最終應該能夠用前者取代後者,以降低長期維護成本。
優點
- 提升效能:分代通常比未分代具有更好的效能,這是因為分代 GC 可以更頻繁地收集年輕代中的物件,而這些物件通常壽命較短,也因此減少了垃圾收集的總時間長度
- 降低維護成本:移除未分代模式可以減少同時支援兩種模式的維護工作,使開發團隊能夠專注開發與優化
- 簡化系統架構,有利於未來功能擴充
缺點
- 可能影響某些程式的效能:對於某些具有特定物件生命週期的程式,未分代模式可能表現得更好,因此移除的話可能會對這些程式產生輕微的效能影響
- 向後相容性:影響到使用未分代模式的程式,需要調整原本針對未分代模式最佳化的設定
- 現有的監控與管理工具可能需要更新
介紹
說明
透過將 ZGenerational
選項標記為過時,並移除未分代 ZGC 的程式碼及測試程式。該選項將在未來版本中到期,屆時 HotSpot JVM 將不再識別(recognize)它,並會拒絕啟動。
在這些更改之後,相關的命令列參數會有以下的行為:
XX:+UseZGC
- 使用 ZGC,並以分代模式啟動
XX:+UseZGC -XX:+ZGenerational
- 使用 ZGC,並以分代模式啟動
- 印出選項已過時的警告
XX:+UseZGC -XX:-ZGenerational
- 使用 ZGC,並以分代模式啟動
- 印出選項已過時的警告
風險
JEP 490 與 JEP 439 和 JEP 474 共享其風險和假設。某些工作負載本質上是與分代無關的,因此可能會看到輕微的性能下降,使得分代模式的性能表現弱於未分代模式。其他風險包括:
- 如果某些程式使用未分代模式時能夠獲得比較好的效能的話,那麼用戶可能需要調整程式碼和設定,使其在分代模式下能保持原有的效能
- 棄用警告訊息可能會導致問題
- 與 JVM 內部、GC 日誌和透過管理介面取得資料等這些項目緊密耦合的工作可能需要多加留意
總結
這項改變反映了 Java 平台持續追求簡化與效能優化的決心。透過統一採用分代模式,ZGC 將能夠在未來提供更穩定且優異的垃圾回收效能。
對於開發者而言,雖然短期內可能需要進行一些調整,但從長遠來看,這種簡化將帶來更好的開發體驗與應用程式效能。建議開發團隊及早開始評估現有系統在轉換至分代模式後的表現,確保順利過渡。
本篇文章的內容為老喬原創、二創或翻譯而來。雖已善盡校對、順稿與查核義務,但人非聖賢,多少仍會有疏漏之處難以避免。如果大家有任何問題、建議或指教,都歡迎在底下留言與老喬討論!