Java虛擬機——G1垃圾收集器

1:是什麼

G1是⼀款⾯向服務端應⽤的垃圾收集器,JDK1.7才正式引入,G1堆空間是一個被分成許多固定大小區域的內存塊。 

 

      圖片中的顏色表明了哪個區域被關聯上什麼角色。活躍對象從一個區域疏散(複製、移動)到另一個區域。區域被設計爲並行的方式收集,可以暫停或者不暫停所有的其它用戶線程。

     明顯的區域可以被分配成Eden、Survivor、Old區域。另外,有第四種類型的區域叫做極大區域(Humongous regions)。這些區域被設計成保持標準區域大小的50%或者更大的對象。它們被保存在一個連續的區域集合裏。最後,最後一個類型的區域就是堆空間裏沒有使用的區域。

2:特點 

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

此部分強烈建議參考 https://www.cnblogs.com/aspirant/p/8663872.html

3:G1 收集器的運作⼤致可劃分爲以下⼏個步驟

  • 初始標記(Initial Marking--標記⼀下 GC Roots 能直接關聯到的對象
  • 併發標記(Concurrent Marking---GC Root 開始對堆中對象進⾏可達性分析,找出存活的對象,這階段耗時較⻓,但可與⽤戶程序併發執⾏ 。
  • 最終標記(Final Marking) ---爲了修正在併發標記期間因⽤戶程序繼續運作⽽導致標記產⽣ 變動的那⼀部分標記記錄。虛擬機將這段時間對象變化記錄在線程 Remembered Set Logs ⾥⾯,最終標記階段需要把 Remembered Set Logs的數據合併到 Remembered Set
  • 篩選回收(Live Data Counting and Evacuation)

4:G1的優勢有哪些 

空間整合:基於標記⼀整理算法實現爲主和Region之間採⽤複製算法實現的垃圾收集 可預測的停頓:這是 G1 相對於 CMS 的另⼀⼤優勢,降低停頓時間是 G1 CMS 共同的關 注點,但 G1 除了追求低停頓外,還能建⽴可預測的停頓時間模型

G1 之前的其他收集器進⾏收集的範圍都是整個新⽣代或者⽼年代,⽽ G1 不再是這樣。使 ⽤ G1 收集器時,Java 堆的內存佈局就與其他收集器有很⼤差別,它將整個 Java 雄劃分爲多 個⼤⼩相等的獨⽴區域(Region),雖然還保留有新⽣代和⽼年代的概念,但新⽣代和⽼年代不再是物理隔髙的了,它們都是⼀部分 Region(不需要連續)的集合。 G1 收集器之所以能建⽴可預測的停頓時間模型,是因爲它可以有計劃地避免在整個 Java 堆 中進⾏全區域的垃圾收集。G1 跟蹤各個 Regions ⾥⾯的垃圾堆積的價值⼤⼩(回收所獲得的 空間⼤⼩以及回收所需時間的經驗值),在後臺維護⼀個優先列表,每次根據允許的收集時 間,優先回收價值最⼤的 Region(這也就是 Garbage- Firsti 名稱的來由)。這種使⽤ Region 劃分內存空間以及有優先級的區域回收⽅式,保證了 G1 收集器在有限的時間內可以 獲取儘可能⾼效率

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章