NO IMAGE

Garbage-first garbage collector,簡稱G1 GC,是最終將用於代替Concurrent Mark-Sweep garbage collector(CMS GC)的新一代垃圾回收器。原本的計劃是作為JDK7新特性的一部分發布,但其後JDK7一直在堅持不懈的跳票,G1也無法再等下去了。目前JDK1.6update14及以後版本的jvm中已經繼承了G1 GC,可以使用引數-XX: UnlockExperimentalVMOptions -XX: UseG1GC來啟用。

G1是一個適用於伺服器端、大記憶體、多CPU情景的垃圾收集器,主要目標是在維持高效率回收(high thoughput)的同時,提供軟實時中斷特性。使用者可以指定一個時間上限,如果垃圾回收導致的程式暫停超過了使用者設定的時間上限,會打斷垃圾回收,恢復程式的執行。

G1的原理在於將堆劃分成等一系列大小的區域,每一個區域都有一個對應的remembered set結構,用來記錄指向這個區域中的地址的其他區域的指標。 在垃圾回收時,選擇記錄最少的一個區域進行,按找這種方式選擇出來的區域,通常是有用資料最少、垃圾最多的區域,這也就是“Garbage-first ”名稱的由來。假如沒有外部的指標指向這個區域,就可以直接回收整塊區域而不用進行記憶體Copy,這種情況真是太好了。

以區域為單位的回收,時間粒度更小,這也是實現垃圾回收軟實時中斷的基礎。

G1付出的代價之一是額外的空間佔用(用於remembered set)。

附送SUN公司的一篇論文,供想了解更多細節的人觀覽。
 

因為G1 GC還不是預設的jvm gc策略(目前為止),需要使用的話可以加入以下引數開啟:

-XX: UnlockExperimentalVMOptions -XX: UseG1GC        #開啟
-XX:MaxGCPauseMillis =50                  #暫停時間目標
-XX:GCPauseIntervalMillis =200          #暫停間隔目標
-XX: G1YoungGenSize=512m            #年輕代大小
-XX:SurvivorRatio=6                            #倖存區比例
#據稱下面兩個引數可能會引發race condition,慎用。
-XX: G1ParallelRSetUpdatingEnabled
-XX: G1ParallelRSetScanningEnabled