• 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]
    
  • 相关阅读:
    【BZOJ 2124】【CodeVS 1283】等差子序列
    【BZOJ 1036】【ZJOI 2008】树的统计Count
    【BZOJ 1901】【ZJU 2112】Dynamic Rankings
    【BZOJ 3924】【ZJOI 2015】幻想乡战略游戏
    【BZOJ 4103】【THUSC 2015】异或运算
    【BZOJ 4513】【SDOI 2016】储能表
    【HDU 3622】Bomb Game
    【BZOJ 3166】【HEOI 2013】Alo
    【BZOJ 3530】【SDOI 2014】数数
    【BZOJ 4567】【SCOI 2016】背单词
  • 原文地址:https://www.cnblogs.com/liangjingfu/p/10008607.html
Copyright © 2020-2023  润新知