更快的JVM垃圾回收器:Shenandoah

banq發表於2021-12-15

在本月早些時候的 re:Invent 年度使用者大會上,AWS推出了開源Shenandoah垃圾收集器的變體,作為其 OpenJDK 發行版Corretto 的第 17 版的預覽。Shenandoah 最初是由 Red Hat 開發的,但最近兩家公司的演算法的“分代模式”提高了吞吐量並大大減少了暫停時間。
Shenandoah是已有的垃圾回收器ZGC、CMS、G1競爭者,它是 JVM 的第一個併發分代垃圾收集器。
新的垃圾收集器Shenandoah提高了效率,因為它只關注記憶體中最有可能存在垃圾的地方,從而減少了暫停應用程式以完成清理工作的時間。
 
Java 一直都有自動記憶體管理。定期 JVM 垃圾收集器會定期遍歷記憶體,以在物件圖中找到那些不再被程式引用的丟棄變數和其他位,然後將其刪除,從而釋放記憶體。它在當時是革命性的:這種自動化提供了優於 C 和 C++ 等舊語言的優勢,在這些語言中,開發人員必須手動釋放不再使用的記憶體,否則會導致安全漏洞。
然而,Java 自動記憶體管理的缺點是相當大的:為了對可以扔掉和不能扔掉的東西進行排序,垃圾收集器必須完全暫停所有程式執行緒以清掃記憶體。這使得該語言不適合某些對時間敏感的關鍵任務任務並減慢大型 Java 應用程式的速度。
為了減少停機時間,Shenandoah 引入了一種稱為分代垃圾收集的新技術。它適用於世代假設:即在大多數情況下,較年輕的物件比較舊的物件更常被丟棄。
Shenandoah 識別出包含新物件的區域,這些物件來自已經至少在一個垃圾收集中倖存下來的物件,這些物件被分成兩代——年輕的和年老的——然後更頻繁地掃過年輕的物件。因為收集器可以專注於包含最多垃圾的區域,所以它降低了暫停時間,縮短了收集週期,並減少了實現低暫停時間所需的記憶體量。
在大多數情況下,基於新一代的 Shenandoah 能夠將暫停時間減少到幾乎無法檢測的 10 毫秒以下,整體應用程式吞吐量不到 5%。

相關文章