jvm 06-G1收集器
阿新 • • 發佈:2018-11-23
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]