天天看點

JVM 記憶體模型和垃圾回收(五): Garbage-First

JVM 記憶體模型和垃圾回收(五): Garbage-First

G1回收是一個服務端的回收方式,适用于多個cpu和記憶體比較大的伺服器使用。

在6GB之下的記憶體下,CMS性能會更好,在6GB之上,G1的性能更好。并且在官方宣稱G1是用來未來替換CMS的。

和CMS不同的一點是:

  • G1是将記憶體分為相等的區域,然後由區域組成邏輯上的Young, Old。
  • G1是一個可以compact的垃圾回收器

着重說一下對old generation的操作:

  1. 初始化标記(STW)

    在此階段,G1 GC 對根進行标記。該階段與正常的年輕代垃圾回收密切相關。

  2. 根region掃描

    在初始标記的存活區掃描對老年代的引用,并标記被引用的對象。該階段與應用程式(非 STW)同時運作,并且隻有完成該階段後,才能開始下一次 STW 年輕代垃圾回收。

  3. 并發标記階段

    G1 GC 在整個堆中查找可通路的(存活的)對象。該階段與應用程式同時運作,可以被 STW 年輕代垃圾回收中斷。

  4. 重新标記階段

    該階段是 STW 回收,幫助完成标記周期。清空 SATB (snapshot-at-the-beginning)區,跟蹤未被通路的存活對象,并執行引用處理。

  5. 清理階段

    執行統計和 RSet 清理STW 操作。G1會識别完全空閑的區域和可供進行混合垃圾回收的區域。清理階段在将空白區域重置并傳回到空閑清單時,該階段為部分并發

  6. 拷貝

    分散或者拷貝存活的對象到那些沒有使用的region。

過程和CMS差不多,主要的特點是:

将記憶體分為region,然後這樣就會有更多的選擇。隻是新增了一種模式, mixed gc。以前可能就是ygc, full gc.現在G1的目标就是盡可能減少full gc,可能通過mixed gc來釋放空間。