1.G1概述
-
為什么有了前面幾個強大的垃圾收集器,還需要
Garbage First(G1) GC?
隨着應用程序所應對的業務越來越龐大、復雜,前面幾款垃圾收集器已經不能滿足實際的需要,所以出現了G1。 -
G1是在延遲可控的情況下,獲得盡可能高的吞吐量,所以才擔當起“全功能收集器”的重任與期望。(全功能收集器的意思是它既負責新生代的垃圾回收又負責老年代的垃圾回收)
-
G1收集器將堆內存划分為很多不想關的區域(Region)(物理上可以是不連續的空間),使用不同的Region來表示Eden,S0區,S1區,老年代等等。 -
G1有計划的避免在整個Java堆中進行全區域的垃圾收集,G1會跟蹤各個Region里面的垃圾堆積的價值大小(回收所獲得的空間大小以及回收所需要的時間經驗值),在后台維護一個優先列表,每次根據允許的收集時間,優先回收價值最大的Region。
-
G1在JDK7中正式啟用,但不是默認的垃圾收集器,在JDK9中成為了默認的垃圾收集器,取代了CMS以及Parallel + Parallel Old組合。在JDK7以及JDK8中,可以使用-XX:+UseG1GC來啟用。
-
G1將堆空間划分為若干個區域(Region),各個region可以是Eden區,Survivor區以及Old區等。
2.G1的優勢與缺點
優勢:
- 並行與並發 - 多個垃圾收集線程同時工作(並行),垃圾收集線程與用戶線程交替執行(並發)。
- 分代收集 -
G1將堆空間划分為若干個區域(Region),這些區域中包含了邏輯上的年輕代和老年代。它不要求年輕代,老年代是連續的。同時,G1同時兼顧年輕代和老年代的垃圾回收,其他的垃圾收集器,要么工作在年輕代,要么工作在老年代。
- 空間整合(內存碎片整理) -
G1內存回收使用Region作為基本單位,Region之間使用的是復制算法,能夠對內存空間進行整理。
- 可預測的停頓時間模型 - 可以讓用戶明確指定在一個長度為
M毫秒的時間片段內,消耗在垃圾收集上的時間不得超過N毫秒。
缺點:
相比於CMS,G1還不具備全方位、壓倒性優勢。比如,G1為了垃圾收集產生的內存占用以及程序運行時的額外執行負載都比CMS要高。
3.G1參數設置
-XX:G1HeapRegionSize 設置每個region的大小,值只能是2的n次方(1,2,4,8,16,32),范圍是1MB到32MB。-XX:MaxGCPauseMillis 設置期望達到(JVM會盡力實現,但不保證)的最大GC停頓時間,默認是200ms。 這個參數如果設置的過小,會導致一次回收的region個數減少,回收的垃圾對象減少(因為設置的垃圾線程工作的時間減少了),如果產生垃圾的速度很快,可能會導致Full GC。-XX:ParallelGCThread 設置STW的時候並行的垃圾線程數量。-XX:ConcGCThreads 設置用戶線程與垃圾收集線程並發的時候,垃圾收集線程的線程數量
通常使用G1收集器,不需要那么多的參數配置。只需要進行下圖所示的3步。其他的參數,G1會自動調節或使用默認的參數。
4.G1使用場景

