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]
原文地址:https://www.cnblogs.com/liangjingfu/p/10008607.html