首頁  >  文章  >  後端開發  >  為什麼 Go 提供亞毫秒的 GC 暫停,而 JVM 卻一直在苦苦掙扎?

為什麼 Go 提供亞毫秒的 GC 暫停,而 JVM 卻一直在苦苦掙扎?

DDD
DDD原創
2024-10-31 21:23:02638瀏覽

Why Does Go Offer Sub-Millisecond GC Pauses While JVMs Historically Struggle?

深入研究影響JVM 與Go 中GC 暫停的架構差異

JVM 中與高GC 暫停的持續性促使人們將其與Go 具有將暫停時間減少到1 毫秒以下的卓越能力。為了闡明這種差異,讓我們深入研究影響每個平台中 GC 效能的架構限制。

Go 的暫停最佳化策略

Go 的垃圾收集器(GCGC)優先考慮最大限度地減少GC 暫停,利用多種技術的組合:

  • 非壓縮、非分代: 這種設計簡化了收集過程,降低了記憶體碎片和影響暫停的風險
  • 並發標記和清除: 標記和清除操作與程式執行同時運行,最大限度地減少停止世界暫停的持續時間。
  • 寫入屏障:為了在並發標記期間保持正確性,實現了寫入屏障,這會引入一些效能開銷。

JVM 的平衡行為

相反JVM GC 傳統上關注吞吐量和壓縮,以提高大型伺服器級電腦的效能。它們採用分代收集和壓縮機制,這會帶來以下權衡:

  • 壓縮:壓縮可以防止記憶體碎片,從而實現更有效率的記憶體分配和快取局部性。
  • 分代收集:根據物件的生命週期將物件分為幾代,透過將短期物件提升到更快收集的空間來優化效能。
  • Stop-the-world 暫停: 每當舊的、永久的空間需要收集時,就會發生這些暫停。

JVM 的最新創新

認識到需要改進暫停時間,JVM 生態系統已經開發了新的收集器:

  • Oracle ZGC:在OpenJDK 16 中引入,ZGC 在執行壓縮時實現了1 毫秒以下的暫停,克服了早期JVM GC 的限制。
  • Shenandoah: Shenandoah 現已在 OpenJDK 17 中提供,它採用與 ZGC 類似的技術,透過並發壓縮實現可比較的效能。

架構注意事項

Go 和 JVM GC 之間的架構差異源自於它們不同的設計理念和效能優先權:

  • GoGC:以非壓縮、非分代方法優先考慮暫停時間。
  • JVM GC:強調吞吐量和壓縮,這歷史上是以犧牲暫停時間為代價的,但ZGC 和Shenandoah 等最近的發展解決了這個問題

總之,Go 的GCGC 和JVM GC 設計的架構差異對其各自的暫停時間有影響。 Go 透過簡單性和並發性優先考慮減少暫停,而 JVM GC 傳統上會為了吞吐量和壓縮而犧牲暫停時間。然而,JVM 技術的進步,特別是 ZGC 和 Shenandoah,正在縮小差距,提供與 Go 相當的暫停時間。

以上是為什麼 Go 提供亞毫秒的 GC 暫停,而 JVM 卻一直在苦苦掙扎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn