JDK 11呼之欲出,ZGC項目加入,讓GC停頓不超過10ms

JDK 11正在成為一個非常棒的版本。如何知道這一點?到目前為止,有13個JEP針對JDK 11。最新的成員是JEP333。雖然它仍然是實驗性的,但看到ZGC出現在了名單上。

JDK 11呼之欲出,ZGC項目加入,讓GC停頓不超過10ms

JDK 11的倒計時已經開始,並且JEP的列表正在變得越來越長。目前,有13個JEP以JDK 11為目標,考慮到JDK 10有12個特性,那麼現在看起來相當不錯。

針對JDK 11的最新JEP是實驗性的,很高興看到ZGC加入,尤其是因為它的目標是“通過消除或大幅度縮短GC停頓,使Java成為更廣泛的應用程序,更具吸引力的平臺。

以下為JAXenter社區與Oracle的技術人員諮詢成員PerLidén討論ZGC的計劃和項目目標。

JAXenter:什麼是ZGC項目?它的目標是什麼?

PerLidén:垃圾收集是Java的主要優勢之一。但是,當垃圾收集停頓時間過長時,它們會開始影響應用程序的響應時間。通過消除或大幅縮短GC停頓的時間長度,我們使Java成為更廣泛的應用程序更具吸引力的平臺。

ZGC項目是OpenJDK社區規模較大的獨立項目。其主要目標是創建一個垃圾收集器,可以處理中等到非常大的堆,同時保持非常低的GC停頓時間。

次要目標是簡化GC調整過程。OpenJDK中的大多數當前GC都有大量的調優選項,以使其能夠適用於大量工作負載。但是,使用這些調整選項通常需要深入理解,或者GC如何在內部工作以及您面臨何種折衷。大多數開發人員只是希望GC能夠工作,並且工作得很好,而無需獲取這些知識。在ZGC項目中,我們一直在努力創造出一種可以降低調諧需求,而不犧牲性能的GC。

JAXenter:ZGC的關鍵原則是什麼?

PerLidén:從高層次來說,實現低延遲的關鍵(特別是在使用非常大的堆時),是讓GC與執行Java線程同時進行。如果某個操作必須在Java線程停止時執行(即處於Stop-The-World階段),那麼完成此類操作所需的時間不會隨著堆或活動集大小而增加。

在ZGC,我們一直努力工作,以確保任何Stop-The-World階段都會以恆定的時間執行,或者在最壞的情況下,以根集大小增加。根集大小與運行的Java線程數量大致相關。

在研究ZGC中使用的特定技術時,我們認為使用彩色指針與低開銷負載屏障是非常強大而簡單的基礎,也是實現併發性的關鍵。

JEP 333:ZGC:可伸縮低延遲垃圾收集器(實驗)

目標

  • GC停頓時間不應超過10ms
  • 處理從相對較小(幾百兆字節)到很大(幾千兆字節)大小的堆
  • 與使用G1相比,應用吞吐量降低不超過15%
  • 為將來的GC功能和利用彩色指針和負載障礙的優化奠定基礎
  • 最初支持的平臺:Linux/x64

限制

ZGC的初始實驗版本不支持ClassUnloading卸載。默認情況下,ClassUnloading和ClassUnloadingWithConcurrentMark選項將被禁用。啟用它們將不起作用。

此外,ZGC最初不會支持JVMCI(即Graal)。如果啟用了EnableJVMCI選項,則會打印一條錯誤消息。

這些限制將在本項目的後期階段處理。

依賴

  • JEP 304:垃圾收集器接口
  • JEP 312:線程局部握手


分享到:


相關文章: