JDK 23 功能:JEP 474 ZGC 預設將改為分代模式

JEP 474: ZGC: Generational Mode by Default

前言

ZGC 全名是 Z Garbage Collector,它是 Java 虛擬機器中一種新型的垃圾回收器,目的是為了實現低延遲高擴展的垃圾收集器。首先在 JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental) 中於 JDK 11 時以實驗性質的方式導入,之後在 JDK 13JEP 351)和 JDK 14JEP 364JEP 365)中陸續有新功能加入,並且在 JDK 15JEP 377)時正式成為可正式使用的產品功能。

ZGC 具有下列優點:

  • 低延遲:在垃圾回收的過程中幾乎不影響應用程式的運行
  • 高擴展:可以處理非常大量的記憶體
  • 並行處理:大部分的垃圾回收工作都是在後台進行的,不會阻塞應用程式的執行緒
  • 自動優化:會根據應用程式和硬體環境去自動調整垃圾回收的設定

JDK 21 時加入 JEP 439 分代模式的功能之後,為了降低同時進行「分代模式」與「未分代模式」的維護成本,並在考慮了大多數的使用情境後,決議將分代模式設定成預設啟動。

JEP 474 概觀

Java 23 (站內介紹) 之中,本功能主要是將 ZGC 的預設模式切換為「分代模式」並棄用「未分代模式」, 同時打算在未來的版本中移除它。目標是將之後的開發能量都集中在分代模式上,這樣一來也可以減少維持兩種不同模式的維護成本。

維護未分代模式已經減緩了一些新功能的開發,在 JEP 439:分代 ZGC 中提到:

分代 ZGC 對於大多數的情況來說,應該是一個比未分代 ZGC 還要更好的解決方案。我們最終應該能夠用前者取代後者,以降低長期維護成本。

優點

  • 提升效能:分代通常比未分代具有更好的效能,這是因為分代 GC 可以更頻繁地收集年輕代中的物件,而這些物件通常壽命較短,也因此減少了垃圾收集的總時間長度
  • 降低維護成本:將分代模式設為預設可以減少同時支援分代和未分代模式的維護工作,使開發團隊能夠專注開發分代模式

缺點

  • 可能影響某些程式的效能:對於某些具有特定物件生命週期的程式,未分代模式可能表現得更好,因此棄用的話可能會對這些程式產生輕微的效能影響
  • 向後相容性:未分代模式已被棄用並可能在未來版本中刪除,這會影響到使用未分代模式的程式

介紹

說明

將分代模式設定成 ZGC 預設模式的方法,是將 ZGenerational 選項的預設值從 false 改為 true。另外,通過棄用 ZGenerational 選項來提出警告,以提供使用者啟動了之後會刪除的未分代模式。我們可以使用下面的命令列參數來檢視此功能的更新:

  • XX:+UseZGC
    • 使用 ZGC,並預設以分代模式啟動
  • XX:+UseZGC -XX:+ZGenerational
    • 使用 ZGC
    • 使用 +ZGenerational 表示啟動分代模式
    • 發出 ZGenerational 選項已被棄用的警告,提醒用戶未來此選項將會被刪除
  • XX:+UseZGC -XX:-ZGenerational
    • 使用 ZGC
    • 使用 -ZGenerational 表示啟動未分代模式
    • 發出 ZGenerational 選項已被棄用的警告,提醒用戶未來此選項將會被刪除
    • 發出未分代模式已被棄用並將被移除的警告,提醒用戶未來只能使用分代模式

切換到分代 ZGC 的工作負載可能會在日誌輸出以及從可維護性和管理 API 獲取的資料方面遇到差異。

風險

某些工作負載本質上是與分代無關的,因此可能會看到輕微的性能下降,使得分代模式的性能表現弱於未分代模式。其他風險包括:

  • 如果某些程式使用未分代模式時能夠獲得比較好的效能的話,那麼用戶可能需要調整程式碼和設定,使其在分代模式下能保持原有的效能
  • 棄用警告訊息可能會導致問題
  • 與 JVM 內部、GC 日誌和透過管理介面取得資料等這些項目緊密耦合的工作可能需要多加留意

總結

JEP 474 將 ZGC 的預設模式從未分代模式切換為分代模式,希望能提高 ZGC 的整體效能並降低維護成本。雖然可能會對某些程式的效能產生輕微影響,但對於大多數程式來說,分代模式將提供更好的效能。

本篇文章的內容為老喬原創、二創或翻譯而來。雖已善盡校對、順稿與查核義務,但人非聖賢,多少仍會有疏漏之處難以避免。如果大家有任何問題、建議或指教,都歡迎在底下留言與老喬討論!

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

ten + 14 =

返回頂端