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]