1.什么是G1
G1是一種服務端應用使用的垃圾收集器,目標是用在多核、大內存的機器上,它在大多數情況下可以實現指定的GC暫停時間,同時還能保持較高的吞吐量
參考鏈接:https://www.oracle.com/technical-resources/articles/java/g1gc.html
2.G1的特點
1.並發收集
2.壓縮空閑空間不會延長GC的暫停時間
3.更易預測的GC暫停時間
4.適用不需要實現很高的吞吐量的場景
5.更加靈活,分Region回收,優先回收花費時間少、垃圾比例高的Region
3.G1邏輯分代模型
每個分區都可能是年輕代也可能是老年代,但是在同一時刻只能屬於某個代。年輕代、幸存區、老年代這些概念還存在,成為邏輯上的概念,這樣方便復用之前分代框架的邏輯。在物理上不需要連續,則帶來了額外的好處——有的分區內垃圾對象特別多,有的分區內垃圾對象很少,G1會優先回收垃圾對象特別多的分區,這樣可以花費較少的時間來回收這些分區的垃圾,這也就是G1名字的由來,即首先收集垃圾最多的分區。新生代其實並不是適用於這種算法的,依然是在新生代滿了的時候,對整個新生代進行回收——整個新生代中的對象要么被回收、要么晉升,至於新生代也采取分區機制的原因,則是因為這樣跟老年代的策略統一,方便調整代的大小。G1還是一種帶壓縮的收集器,在回收老年代的分區時,是將存活的對象從一個分區拷貝到另一個可用分區,這個拷貝的過程就實現了局部的壓縮。每個分區的大小從1M到32M不等,但是都是2的冥次方。
- Collection Set
簡稱CSet。一組可被回收的分區的集合。在CSet中存活的數據會在GC過程中被移動到另一個可用分區,CSet中的分區可以來自Eden空間、survivor空間、或者老年代。CSet會占用不到整個堆空間的1%大小。
-
RememberedSet
簡稱RSet。記錄了其他Region中的對象到本Region的引用RSet的價值在於使得垃圾收集器不需要掃描整個堆找到誰引用了當前分區中的對象,只需要掃描RSet即可。
由於RSet 的存在,那么每次給對象賦引用的時候,就得做一些額外的操作,在RSet中做一些額外的記錄(在GC中被稱為寫屏障),這個寫屏障 不等於 內存屏障
-
Region的大小
Region的取值1,2,4,8,16,32
可以手工指定-XX:G1HeapRegionSize
-
新老年代比例
5% - 60%:一般不用手工指定也不要手工指定,因為這是G1預測停頓時間的基准
-
humongous object
超過單個region的50%被稱為大對象
4.G1中的GC
-
MixedGC
和CMS過程一樣,並發標記的過程采用三色標記+SATB
XX:InitiatingHeapOccupacyPercent:默認值45%,當O超過這個值時,啟動MixedGC
-
FGC
java 10以前是串行FullGC,之后是並行FullGC