1. 程式人生 > >jvm 06-G1收集器

jvm 06-G1收集器

G1收集器(Garbage First)

  • 從JDK1.7 u4版本之後正式引入到Java中的垃圾收集器
  • 此類垃圾收集器主要應用在多CPU以及大記憶體的伺服器環境下
  • 主要特點是極大的減少垃圾收集的停頓時間,以提升伺服器的操作效能
  • 引入此收集器的目的是為了在將來的某一時間內可以替換掉CMS收集器

G1區域劃分

  • G1垃圾收集器採用的是區域化、分散式的垃圾收集器
  • G1垃圾收集器將整個堆記憶體區域劃分成大小相同的子區域(Region)
  • 在JVM啟動時會自動設定這些子區域的大小
    • 區域大小範圍1MB ~ 32MB,最多可以設定2048個區域
    • 最大記憶體為32MB * 2048 = 65536M,即64G記憶體
  • Eden、Survivor和Tenured就變為了一系列不連續的記憶體區域,避免了全記憶體區的GC操作
  • 在G1之中不再區分所謂的新生代、老年代記憶體空間,所有的記憶體空間就是一塊

GC策略

  • 雖然在G1收集器裡面將整個的記憶體區域都混合在一起
  • 但是其本身依然也是在小範圍內要進行新生代與老年代的區分
  • 也就是說依然會採用不同的GC方式來處理不同的區域

G1新生代物件回收

  • 所有的垃圾記憶體的儲存區域有可能會被清空後重新分配

G1老年代回收

  • G1在老年代垃圾回收最大的好處在於進行全記憶體掃描是,只需要安裝區域來進行掃描即可

G1收集器引數

  • -XX:G1HeapRegionSize=n:設定G1區域的大小,每個區域大小可選範圍1MB ~ 32MB之間。目標是根據最小的堆記憶體大小劃分出約2048個區域
  • -XX:MaxGCPauseMillis=n:設定回收的最大時間
  • -XX:G1NewSizePercent=n:設定新生代最小使用的空間比率,預設Java堆記憶體的5%
  • -XX:G1MaxNewSizePercent=n:設定新生代最大使用的空間比率,預設Java堆記憶體的6%
  • -XX:ParallelGCThreads=n:設定STW工作執行緒數的值,與使用的CPU數量有關,最大值為8。如果CPU數量超過8個,則最多可以設定總CPU數量的5/8
  • -XX:ConcGCThreads=n:設定並行標記執行緒數
  • -XX:InitiatingHeapOccupancyPercent=n:設定佔用區域的百分比,超過此百分比將觸發GC操作,預設為45%
  • -XX:NewRatio=n:設定新生代與老年代的比率(young/tenured),預設為2
  • -XX:SurvivorRatio=n:設定Eden與Survivor的比率(Eden/Survivor),預設為8
  • -XX:MaxTenuringThreshold=n:新生代儲存到老年代的歲數
  • -XX:G1ReservePercent=n:設定預留空間的空閒百分比,以降低目標空間的溢位風險,預設為10%

使用G1回收器策略

測試程式碼:

package cn.liang.jvm;
public class gctest2 {
  public static void main(String[] args) {
      String string = "liangjingfu";
      while (true) {
          string += string + string;
          string.intern();    
      }
  }
}

配置JVM:

-Xmx10m -Xms10m -XX:+UseG1GC -XX:+PrintGCDetails

輸出結果:

[GC pause (G1 Humongous Allocation) (young), 0.0007849 secs]
   [Parallel Time: 0.3 ms, GC Workers: 4]
      [GC Worker Start (ms): Min: 139.8, Avg: 139.9, Max: 140.1, Diff: 0.3]
      [Ext Root Scanning (ms): Min: 0.0, Avg: 0.1, Max: 0.2, Diff: 0.2, Sum: 0.5]
      [Update RS (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0]
         [Processed Buffers: Min: 0, Avg: 0.5, Max: 1, Diff: 1, Sum: 2]
      [Scan RS (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0]
      [Code Root Scanning (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0]
      [Object Copy (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0]
      [Termination (ms): Min: 0.0, Avg: 0.1, Max: 0.1, Diff: 0.1, Sum: 0.3]
         [Termination Attempts: Min: 1, Avg: 1.0, Max: 1, Diff: 0, Sum: 4]
      [GC Worker Other (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0]
      [GC Worker Total (ms): Min: 0.0, Avg: 0.2, Max: 0.3, Diff: 0.3, Sum: 0.9]
      [GC Worker End (ms): Min: 140.1, Avg: 140.1, Max: 140.1, Diff: 0.0]
   [Code Root Fixup: 0.0 ms]
   [Code Root Purge: 0.0 ms]
   [Clear CT: 0.1 ms]
   [Other: 0.3 ms]
      [Choose CSet: 0.0 ms]
      [Ref Proc: 0.2 ms]
      [Ref Enq: 0.0 ms]
      [Redirty Cards: 0.1 ms]
      [Humongous Register: 0.0 ms]
      [Humongous Reclaim: 0.0 ms]
      [Free CSet: 0.0 ms]
   [Eden: 0.0B(2048.0K)->0.0B(2048.0K) Survivors: 0.0B->0.0B Heap: 4083.6K(10.0M)->4083.6K(10.0M)]
 [Times: user=0.00 sys=0.00, real=0.00 secs]