zoukankan      html  css  js  c++  java
  • 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]
    
  • 相关阅读:
    MagicAjax简单介绍(转)
    .net中RegisterStartupScript与RegisterClientScriptBlock的区别
    改变你一生的五句话 (转)
    苏州园林年卡 办理与使用 附 苏州园林门票价格
    常见的 ASP.NET 2.0 转换问题和解决方案(转)
    .net新手须知
    AJAX开发简略 (转)
    magicajax为什么不能提交? magicajax的一个bug
    所谓:有实际开发工作经验 (转)
    解读60 70 80年代职场人
  • 原文地址:https://www.cnblogs.com/liangjingfu/p/10008607.html
Copyright © 2011-2022 走看看