关于 G1(Garbage First)垃圾收集器
文章目錄
- G1收集器
- 概念
- 設計思路
- 設計原理
- 執行步驟:
G1收集器
概念
G1(Garbage First)是一款主要面向服務端應用的垃圾收集器,JDK 9發布之日,G1宣告取代ParallelScavenge加Parallel Old組合,成為服務端模式下的默認垃圾收集器,而CMS則淪落至被聲明為不推薦使用(Deprecate)的收集器。
G1收集器是垃圾收集器技術發展歷史上的里程碑式的成果,它開創了收集器面向局部收集的設計思路和基于Region的內存布局形式。
設計思路
雖然G1也仍是遵循分代收集理論設計的,但其堆內存的布局與其他收集器有非常明顯的差異:
- G1不再堅持固定大小以及固定數量的分代區域劃分,而是把連續的Java堆劃分為多個大小相等的獨立區域(Region),每一個Region都可以根據需要,扮演新生代的Eden空間、Survivor空間,或者老年代空間。
收集器能夠對扮演不同角色的Region采用不同的策略去處理,這樣無論是新創建的對象還是已經存活了一段時間、熬過多次收集的舊對象都能獲取很好的收集效果。
設計原理
Region中還有一類特殊的Humongous區域,專門用來存儲大對象。G1認為只要大小超過了一個Region容量一半的對象即可判定為大對象。
每個Region的大小可以通過參數 -XX:G1HeapRegionSize設定,取值范圍為1MB~32MB,且應為2的N次冪。
而對于那些超過了整個Region容量的超級大對象,將會被存放在N個連續的 Humongous Region 之中,G1的大多數行為都把 Humongous Region 作為老年代的一部分來進行看待
如下圖所示:
雖然G1仍然保留新生代和老年代的概念,但新生代和老年代不再是固定的了,它們都是一系列區域(不需要連續)的動態集合。
G1收集器之所以能建立可預測的停頓時間模型,是因為它將Region作為單次回收的最小單元,即每次收集到的內存空間都是Region大小的整數倍,這樣可以有計劃地避免在整個Java堆中進行全區域的垃圾收集。
更具體的處理思路是讓G1收集器去跟蹤各個Region里面的垃圾堆積的“價值”大小,價值即回收所獲得的空間大小以及回收所需時間的經驗值,然后在后臺維護一個優先級列表,每次根據用戶設定允許的收集停頓時間(使用參數-XX:MaxGCPauseMillis指定,默認值是200毫秒),優先處理回收價值收益最大的那些Region,這也就是“Garbage First”名字的由來。這種使用Region劃分內存空間,以及具有優先級的區域回收方式,保證了G1收集器在有限的時間內獲取盡可能高的收集效率。
執行步驟:
如果我們不去計算用戶線程運行過程中的動作,G1收集器的運作過程大致可劃分為以下四個步驟:
- 初始標記: 僅僅是標記一些GC Roots能直接關聯到的對象,并且修改TAMS指針的值,讓下一階段用戶線程并發運行時,能正確地在可用的Region中分配新的對象。
- 并發標記: 從GC Roots開始對堆中對象進行可達性分析,遞歸掃描整個堆里的對象圖,找出要回收的對象,與用戶線程并發執行。
- 最終標記: 對用戶線程做另一個短暫的暫停,用于處理并發階段結束后仍遺留下來的最后那少量的SATB記錄。
- 篩選回收: 負責更新Region的統計數量,對各個Region進行回收價值和成本排序,根據用戶期望的停頓時間制定回收計劃,然后把決定回收的那一部分Region的存活對象復制到空的Region中,再清理掉整個舊的Region的全部空間。
下面是G1收集器的運行示意圖:
總結
以上是生活随笔為你收集整理的关于 G1(Garbage First)垃圾收集器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【pyecharts50例】带阴影效果折
- 下一篇: 使用Drawable绘制圆角矩形