• JVM参数调优——G1收集器


    开启 G1 Collector

    G1收集器的出现除了提供可控的低延迟GC,解决历史收集器的一些弊病,同时还尽力简化调优参数
    对于大多数应用,开启收集器,再配置一下Xms和Xmx就足够了(不建议配置Xmn)

    -XX:+UseG1GC
    
    • 1

    核心参数

    • 最大暂停时间的目标值
      默认值为200毫秒。
      太大会导致延迟大,太小会导致频繁GC,吞吐下降,请结合堆大小酌情谨慎调节。一般情况下,使用默认值就好。
    -XX:MaxGCPauseMillis=200
    
    • 1
    • G1每个Region的大小
      该值为2的幂,范围为1MB到32MB。我们的目标是根据最小Java堆大小拥有大约2048个区域。
      建议交给JVM自动分配
    -XX:G1HeapRegionSize=n
    
    • 1

    重要参数

    • 年轻代堆大小的最小值
      设置年轻代堆大小占整个堆的百分比
      默认值是Java堆的5% (experimental VM flag)

    • 年轻代堆大小的最大值
      设置年轻代堆大小占整个堆的百分比。
      默认值是Java堆的60%。(experimental VM flag)

    -XX:G1NewSizePercent=5
    
    -XX:G1MaxNewSizePercent=60
    
    • 1
    • 2
    • 3
    • 触发标记周期的Java堆占用率阈值
      触发标记周期的Java堆占用率阈值。默认占用率是整个Java堆的45%。
    -XX:InitiatingHeapOccupancyPercent=45
    
    • 1
    • MixedGC周期中的老年代的占用率阈值
      设置要包含在混合垃圾收集周期中的老年代的占用率阈值。默认占用率为85%。(experimental VM flag)
      (OldRegion 中 对象存活百分比
    -XX:G1MixedGCLiveThresholdPercent=85
    
    • 1
    • 允许堆浪费的百分比
      设置您愿意浪费的堆的百分比。默认值为10%。
      当可回收百分比小于堆浪费百分比时,Java HotSpot VM不会启动混合垃圾收集周期。
    -XX:G1HeapWastePercent=10
    
    • 1
    • MixedGC周期中收集老年代区域的上限
      设置在一个混合垃圾收集周期中要收集的老年代区域的上限。默认值为Java堆的10%。
    -XX:G1OldCSetRegionThresholdPercent=10
    
    • 1
    • 保留空闲内存百分比
      设置保持空闲的保留内存百分比,以降低到空间溢出的风险。默认值为10%。
    -XX:G1ReservePercent=10
    
    • 1
    • MixedGC收集的目标数量
      设置标记周期后混合垃圾收集的目标数量,以收集旧区域(OldRegion 中 对象存活百分比
    -XX:G1MixedGCCountTarget=8
    
    • 1

    GC问题分析

    问题特征

    使用默认配置参数,(MaxGCPauseMillis=200)多个服务GC收集器从CMS转到G1效果都很好,GC耗时每分钟 大都在40ms以内,但是有个服务就与众不同了。

    1. YoungGC耗时长 300~500ms 有时1s+;
    2. mixedGC 频次低,耗时短,都在50ms以内;
    3. 日志中常见 to survivor 耗尽 (to-space exhausted);

    分析思路

    • 调小年轻代
      让yongGC频繁一些,快一些
      默认5%~60%
    -XX:+UnlockExperimentalVMOptions 
    -XX:G1NewSizePercent=25 
    -XX:G1MaxNewSizePercent=40
    
    • 1
    • 2
    • 3
    • mixedGC调节
      提前触发,每次多回收一些

    提前触发标记周期 45%–>35%
    mixedGC扫描的老年代的占用率阈值,占用率高的不再扫描 85%–>65% (experimentalVMOptions)
    mixedGC中要收集的老年代区域占整个堆的百分比上限 10%–>20%
    混合垃圾收集的目标数量,多分几次执行 8–>12

    -XX:InitiatingHeapOccupancyPercent=35
    -XX:+UnlockExperimentalVMOptions -XX:G1MixedGCLiveThresholdPercent=65
    -XX:G1OldCSetRegionThresholdPercent=20
    -XX:G1MixedGCCountTarget=12 
    
    • 1
    • 2
    • 3
    • 4
    • 防止晋升失败
      少浪费一些:10%–>5%
      空闲空间多留一些:10%–>20%
      如大对象晋升失败,可调大Region
    -XX:G1HeapWastePercent=5 
    -XX:G1ReservePercent=20
    -XX:G1HeapRegionSize=8
    
    • 1
    • 2
    • 3

    常用命令

    • 查看G1 experimental flag
    java  -XX:+UnlockExperimentalVMOptions -XX:+PrintFlagsFinal -version|grep 'experimental' |grep G1
    
    • 1
    • 查看某进程X设定的VM参数
      例如查看 MaxGCPauseMillis 的值
    jinfo -flag MaxGCPauseMillis pid
    
    • 1
    • 查看进程GC情况
      各分区使用情况,GC次数和时间
    jstat -gc pid
    
    • 1
    • 查看进程VM参数
    jinfo -flags pid
    
    • 1

    G1常见日志解析

    • GC pause (GCLocker Initiated GC) (young)
      这个是一个由GCLocker发起的年轻代垃圾收集事件。GCLocker是Java的一个特性,它可以在某些情况下阻止垃圾收集器运行,以避免对应用程序产生负面影响。当GCLocker释放时,它可能会触发一次垃圾收集。
      使用JNI临界区的方式操作数组或者字符串时,为了防止GC过程中jarray或者jstring发生位移,而导致数组指针失效,需要保持它们在JVM Heap中的地址在JNI Critical过程中保持不变。于是JVM实现了GC_locker,用于JNI Critical内阻止其他GC的发生。

    • GC pause (G1 Evacuation Pause) (young)
      年轻代已满,执行 YoungGC。
      其中"Evacuation"表示在垃圾收集期间,存活的对象被从一个区域移动到另一个区域。

    • GC pause (G1 Humongous Allocation) (young) (initial-mark)
      在年轻代发现了一个"Humongous"对象(即大于G1中region大小50%的对象),触发YoungGC,当前正在进行初始标记阶段。在这个阶段,垃圾收集器会标记出所有的根对象和年轻代中的存活对象。

    • GC pause (G1 Humongous Allocation) (young) (to-space exhausted)
      年轻代发现了一个"Humongous"对象,并且用于存储新对象的"To Space"已经耗尽。执行YoungGC来释放空间。

    • GC pause (G1 Evacuation Pause) (mixed)
      老年代空间占整个堆空间比例达到阈值(默认45%),执行 MixedGC。

    • Full GC (Allocation Failure)
      堆内存空间不足以分配新的对象,触发Full GC。

    reference

    • https://www.oracle.com/technical-resources/articles/java/g1gc.html
    • https://code84.com/882088.html
  • 相关阅读:
    目标检测网络系列之R-CNN
    C++学习第九课--类的成员函数、对象复制与私有成员笔记
    笔记:GO1.19 带来的优化(重新编译juicefs)
    WEB 跨域
    图表背后的故事:数据可视化的威力与影响
    算法升级之路(七)-盛最多水的容器
    【leetcode】【剑指offer Ⅱ】067. 最大的异或
    Nvidia GPU 入门教程之 11 数据中心 GPU 的对决:A100 与 V100S
    【山东科技大学OJ】2413 Problem C: 逆序输出
    Python编程笔记
  • 原文地址:https://blog.csdn.net/fgszdgbzdb/article/details/133144609