Java通過分代功能增強垃圾收集器ZGC

2023-07-16     InfoQ

原標題:Java通過分代功能增強垃圾收集器ZGC

作者 | A N M Bazlur Rahman

譯者 | 平川

策劃 | 丁曉昀

在 JDK 21 中,JEP 439(分代 ZGC)從 Targeted 狀態提升到 Completed 狀態。該 JEP 建議,擴展 Z Garbage Collector(ZGC),為年輕對象和老對象維護單獨的代,從而提高應用程式的性能。這將使得 ZGC 可以更頻繁地收集趨於早亡的年輕對象。

Z Garbage Collector 專為低延遲和高可擴展性而設計,從 JDK 15 開始就可用於生產環境。它的大部分工作都是在應用程式線程運行過程中完成的,只會短暫中斷這些線程。ZGC 的暫停時間以微秒為單位進行持續的測量,這使得它成為低延遲、高可擴展工作負載的首選。

新一代 ZGC 旨在降低分配停頓的風險,減少所需的堆內存開銷,並減少垃圾收集的 CPU 開銷。與非分代 ZGC 相比,這些優點預計並不會顯著降低吞吐量。非分代 ZGC 的基本性質保持不變,如暫停時間不超過 1 毫秒,支持的堆大小從幾百 MB 到許多 TB。

分代 ZGC 基於弱分代假說,即年輕對象往往會在年輕時死去,而老對象往往會保留下來。通過更頻繁地收集年輕對象,ZGC 可以提高應用程式的性能。

最初,分代 ZGC 與非分代 ZGC 是一起提供的。用戶可以在 -XX:+UseZGC 命令行選項中添加 -XX:+ZGenerational 選項,以選擇 Generational ZGC。在未來的版本中,分代 ZGC 將成為默認選項,最終,非分代 ZGC 將被刪除。

$ java -XX:+UseZGC -XX:+ZGenerational ...

新的分代 ZGC 將堆劃分為兩個邏輯代:年輕代用於最近分配的對象,老年代用於長期對象。每個代獨立收集,讓 ZGC 可以專注於收集有利可圖的年輕對象。

分代 ZGC 引入了多個使其不同於非分代 ZGC 和其他垃圾收集器的設計概念,包括無多重映射內存、優化屏障、雙緩衝記憶集、無追加堆內存重定位、密集堆區域、大對象和完整垃圾收集。

分代 ZGC 的引入可以大幅提升在 Java 平台上運行應用程式的性能。通過更頻繁地收集年輕對象,分代 ZGC 可以帶來更低的延遲、更少的內存開銷和更高的 CPU 利用率。這使得它在大多數用例中都成為比非分代 ZGC 更好的解決方案。

它引入了一個更複雜的系統。該系統在加載和存儲屏障中使用了顯式代碼,並且並發運行兩個垃圾收集器。新系統不使用多重映射內存,使用戶更容易測量堆內存的使用情況,並可能將最大堆大小增加到超過非分代 ZGC 的 16TB 限制。加載和存儲屏障使用快速路徑和慢速路徑、記憶集屏障、SATB 標記屏障、融合存儲屏障檢查和存儲屏障緩衝等技術進行了優化。分代 ZGC 還引入了雙緩衝記憶集,用於準確跟蹤代際指針,並允許重定位,而且不需要額外的堆內存,進而實現高效的年輕代收集。該系統還可以很好地處理大對象,允許將它們分配給年輕代,而如果它們的壽命比較長,就將它們提升到老年代。完整垃圾收集將年輕代對象指向老年代對象的指針視為老年代對象圖的根。

總之,OpenJDK 中的分代 ZGC 實現引入了一個更為複雜的系統,它並發運行兩個垃圾收集器,並使用更複雜的屏障和染色指針(coloured pointer)。儘管複雜,但長期目標是用分代版本完全替換非分代 ZGC,以最小化維護成本。雖然大多數用例都有望從分代 ZGC 中受益,但一些非分代工作負載可能會出現輕微的性能下降。不過,因為不必頻繁地收集老年代的對象,所以可以認為潛在的開銷已被抵消。分代 ZGC 未來的改進和優化將由基準測試和用戶反饋所驅動。分代 ZGC 的引入是提高 Java 平台應用程式性能的重要一步。

原文連結

https://www.infoq.com/news/2023/07/java-enhance-zgc/

阿里改革,P8 成為歷史;GPT-4 模型架構泄露;OpenAI 面臨最嚴調查,Altman 驚慌連發 3 推|Q 資訊

神器還是垃圾?那些用 AIGC 編程的人,實踐得怎麼樣了

甲骨文火上澆油、SUSE投入1000萬美元,多方「圍剿」紅帽:「紅帽負擔不起?那我們來!」

5天內用戶數破億、增速碾壓ChatGPT,Twitter勁敵Threads是如何構建的?

文章來源: https://twgreatdaily.com/zh-sg/1984c3dc0b761e1a0a26094492b006e1.html