JVM性能調優-你不得不懂的G1收集器

  • 2019 年 12 月 20 日
  • 筆記

簡介:G1垃圾收集器
是什麼

G1是⼀款⾯向服務端應⽤的垃圾收集器

特點

G1 中每個 Region 都有⼀個與之對應的 Remembered Set,當進⾏記憶體回收時,在 GC 根節點的枚舉範圍中加⼊ Remembered Set 即可保證不對全堆掃描也不會有遺漏 檢查Reference引⽤的對象是否處於不同的Region

G1 收集器的運作⼤致可劃分為以下⼏個步驟
  • 初始標記(Initial Marking) –標記⼀下 GC Roots 能直接關聯到的對象
  • 並發標記(Concurrent Marking)—從GC Root 開始對堆中對象進⾏可達性分析,找出存活的對象,這階段耗時較⻓,但可與⽤戶程式並發執⾏
  • 最終標記(Final Marking) —為了修正在並發標記期間因⽤戶程式繼續運作⽽導致標記產⽣變動的那⼀部分標記記錄。虛擬機將這段時間對象變化記錄在執行緒 Remembered Set Logs⾥⾯,最終標記階段需要把 Remembered Set Logs的數據合併到 Remembered Set 中
  • 篩選回收(Live Data Counting and Evacuation)
G1的優勢有哪些
  • 空間整合:基於「標記⼀整理」演算法實現為主和Region之間采⽤複製演算法實現的垃圾收集
  • 可預測的停頓:這是 G1 相對於 CMS 的另⼀⼤優勢,降低停頓時間是 G1 和 CMS 共同的關注點,但 G1 除了追求低停頓外,還能建⽴可預測的停頓時間模型
  • 在 G1 之前的其他收集器進⾏收集的範圍都是整個新⽣代或者⽼年代,⽽ G1 不再是這樣。使⽤ G1 收集器時,Java 堆的記憶體布局就與其他收集器有很⼤差別,它將整個 Java 雄劃分為多個⼤⼩相等的獨⽴區域(Region),雖然還保留有新⽣代和⽼年代的概念,但新⽣代和⽼年代不再是物理隔髙的了,它們都是⼀部分 Region(不需要連續)的集合。
  • G1 收集器之所以能建⽴可預測的停頓時間模型,是因為它可以有計劃地避免在整個 Java 堆中進⾏全區域的垃圾收集。G1 跟蹤各個 Regions ⾥⾯的垃圾堆積的價值⼤⼩(回收所獲得的空間⼤⼩以及回收所需時間的經驗值),在後台維護⼀個優先列表,每次根據允許的收集時間,優先回收價值最⼤的 Region(這也就是 Garbage- Firsti 名稱的來由)。這種使⽤Region 劃分記憶體空間以及有優先順序的區域回收⽅式,保證了 G1 收集器在有限的時間內可以獲取儘可能⾼