5-JVM的GC算法(3)

G1收集器

G1收集器(Garbage First)是從JDK1.7 u4版本之後正式引入到java中的垃圾收集器,此類垃圾收集器主要應用在多CPU以及大內存的服務器環境下這樣可以極大的減少垃圾收集的 爲了在將來某一個時間內可以替換掉CMS(Concurrent Mark Sweep)收集器。

 

G1垃圾收集器採用的是區域化、分佈式的垃圾收集器。其核心思想爲將整個隊內存區域劃分成大小相同的子區域(Region),在JVM啓動時會自動設置這些子區域的大小(區域大小範圍「1MB~32MB」,最多可以設置2048個區域,即支持的最大內存爲:「32MB*2048=65536M」、64GB內存),這樣Eden,Survivor,Tenured就變爲了一系列不連續的內存區域,也就避免全內存區的GC操作。 O是老年代,E是Eden區,S是Survivor區

 

圖一:G1收集器內部分區

雖然G1收集器裏面講將所有內存看成一個整體,但是在整體的內部還是採用了分區的思想,並針對不同的區域採用不同的GC算法。在回收垃圾的時候就觀察每一塊可以內存大小發生變化沒,如果可以內存沒有變,那麼就不需要掃描,從而使得整個的掃描效率有所提高

 

G1收集器對年輕代的收集過程:

圖二:標記出待收集的內存區域

圖三:收集垃圾並重新分配內存

年輕代:所有垃圾的保存區域有可能會被清空後重新分配

 

 

G1收集器對老年代的收集過程:

但是老年代的處理流程不一樣,因爲任何時候如果想要標註老年代不用的內存,都需要進行一些暫停,而G1中最大的好處在於它不用全局掃描只需要按照區域來掃描即可。


圖四:老年代G1收集器的線程變化情況

 

具體流程(圖五至圖八):

圖五:標記出待回收的老年代的區域

圖六:回收待回收的老年代的區域

 

圖七:掃描整合出Eden的內存,把活躍的內存複製到老年代

 

圖八:收集後的結果

 

最後強調兩點:

1、G1收集器的垃圾處理和傳統的垃圾回收不一樣,關鍵因素是它將所有的內存進行了子區域劃分。

2、G1收集器的沒有默認配置,需要慎重使用,具體配置方法可百度。