1. 暂停时间:用-XX:MaxGCPauseMillis来指定,默认值200ms。这是一个软性目标,G1会尽量达成,如果达不成,会逐渐做自我调整。对于Young GC来说,会逐渐减少Eden区个数,减少Eden空间那么Young GC的处理时间就会相应减少;对于Mixed GC,G1会调整每次Choose Cset的比例,默认最大值是10%,当然每次选择的Cset少了,所要经历的Mixed GC的次数会相应增加。同时减少Eden的总空间时,就会更加频繁的触发Young GC,也就是会加快Mixed GC的执行频率,因为Mixed GC是由Young GC触发的,或者说借机同时执行的。频繁GC会对对应用的吞吐量造成影响,每次Mixed GC回收时间太短,回收的垃圾量太少,可能最后GC的垃圾清理速度赶不上应用产生的速度,那么可能会造成串行的Full GC,这是要极力避免的。所以暂停时间肯定不是设置的越小越好,当然也不能设置的偏大,转而指望G1自己会尽快的处理,这样可能会导致一次全部并发标记后触发的Mixed GC次数变少,但每次的时间变长,STW时间变长,对应用的影响更加明显。
  2. Region大小:用-XX:G1HeapRegionSize来指定,若未指定则默认最多生成2048块,每块的大小需要为2的幂次方,如1,2,4,8,16,32,最大值为32M。Region的大小主要是关系到Humongous Object的判定,当一个对象超过Region大小的一半时,则为巨型对象,那么其会至少独占一个Region,如果一个放不下,会占用连续的多个Region。当一个Humongous Region放入了一个巨型对象,可能还有不少剩余空间,但是不能用于存放其他对象,这些空间就浪费了。所以如果应用里有很多大小差不多的巨型对象,可以适当调整Region的大小,尽量让他们以普通对象的形式分配,合理利用Region空间。
  3. 新生代比例:新生代比例有两个数值指定,下限:-XX:G1NewSizePercent,默认值5%,上限:-XX:G1MaxNewSizePercent,默认值60%。G1会根据实际的GC情况(主要是暂停时间)来动态的调整新生代的大小,主要是Eden Region的个数。最好是Eden的空间大一点,毕竟Young GC的频率更大,大的Eden空间能够降低Young GC的发生次数。但是Mixed GC是伴随着Young GC一起的,如果暂停时间短,那么需要更加频繁的Young GC,同时也需要平衡好Mixed GC中新生代和老年代的Region,因为新生代的所有Region都会被回收,如果Eden很大,那么留给老年代回收空间就不多了,最后可能会导致Full GC。
  4. 并发GC线程数:通过 -XX:ConcGCThreads来指定,默认是-XX:ParallelGCThreads/4,也就是在非STW期间的GC工作线程数,当然其他的线程很多工作在应用上。当并发周期时间过长时,可以尝试调大GC工作线程数,但是这也意味着此期间应用所占的线程数减少,会对吞吐量有一定影响。
  5. 并行GC线程数:通过 -XX:ParallelGCThreads来指定,也就是在STW阶段工作的GC线程数,其值遵循以下原则:
    ① 如果用户显示指定了ParallelGCThreads,则使用用户指定的值。
    ② 否则,需要根据实际的CPU所能够支持的线程数来计算ParallelGCThreads的值,计算方法见步骤③和步骤④。
    ③ 如果物理CPU所能够支持线程数小于8,则ParallelGCThreads的值为CPU所支持的线程数。这里的阀值为8,是因为JVM中调用nof_parallel_worker_threads接口所传入的switch_pt的值均为8。
    ④ 如果物理CPU所能够支持线程数大于8,则ParallelGCThreads的值为8加上一个调整值,调整值的计算方式为:物理CPU所支持的线程数减去8所得值的5/8或者5/16,JVM会根据实际的情况来选择具体是乘以5/8还是5/16。
    比如,在64线程的x86 CPU上,如果用户未指定ParallelGCThreads的值,则默认的计算方式为:ParallelGCThreads = 8 + (64 - 8) * (5/8) = 8 + 35 = 43。
  6. 被纳入Cset的Region的存活空间占比阈值:通过 -XX:G1MixedGCLiveThresholdPercent指定,不同版本默认值不同,有65%和85%。在全局并发标记阶段,如果一个Region的存活对象的空间占比低于此值,则会被纳入Cset。此值直接影响到Mixed GC选择回收的区域,当发现GC时间较长时,可以尝试调低此阈值,尽量优先选择回收垃圾占比高的Region,但此举也可能导致垃圾回收的不够彻底,最终触发Full GC。
  7. 触发全局并发标记的老年代使用占比:通过-XX:InitiatingHeapOccupancyPercent指定,默认值45%,也就是老年代占堆的比例超过45%。如果Mixed GC周期结束后老年代使用率还是超过45%,那么会再次触发全局并发标记过程,这样就会导致频繁的老年代GC,影响应用吞吐量。同时老年代空间不大,Mixed GC回收的空间肯定是偏少的。可以适当调高IHOP的值,当然如果此值太高,很容易导致年轻代晋升失败而出发Full GC,所以需要多次调整测试。
  8. 触发Mixed GC的堆垃圾占比:通过-XX:G1HeapWastePercent指定,默认值5%,也就是在全局标记结束后能够统计出所有Cset内可被回收的垃圾占整对的比例值,如果超过5%,那么就会触发之后的多轮Mixed GC,如果不超过,那么会在之后的某次Young GC中重新执行全局并发标记。可以尝试适当的调高此阈值,能够适当的降低Mixed GC的频率。
  9. 每轮Mixed GC回收的Region最大比例:通过-XX:G1OldCSetRegionThresholdPercent指定,默认10%,也就是每轮Mixed GC附加的Cset的Region不超过全部Region的10%,最多10%,如果暂停时间短,那么可能会少于10%。一般这个值不需要额外调整。
  10. 一个周期内触发Mixed GC最大次数:通过-XX:G1MixedGCCountTarget指定,默认值8。也就是在一次全局并发标记后,最多接着8此Mixed GC,也就是会把全局并发标记阶段生成的Cset里的Region拆分为最多8部分,然后在每轮Mixed GC里收集一部分。这个值要和上一个参数配合使用,8*10%=80%,应该来说会大于每次标记阶段的Cset集合了。一般此参数也不需额外调整。
  11. G1为分配担保预留的空间比例:通过-XX:G1ReservePercent指定,默认10%。也就是老年代会预留10%的空间来给新生代的对象晋升,如果经常发生新生代晋升失败而导致Full GC,那么可以适当调高此阈值。但是调高此值同时也意味着降低了老年代的实际可用空间。
  12. 谨慎使用Soft Reference。如果SoftReference过多,会有频繁的老年代收集。-XX:SoftRefLRUPolicyMSPerMB参数,可以指定每兆堆空闲空间的软引用的存活时间,默认值是1000,也就是1秒。可以调低这个参数来触发更早的回收软引用。如果调高的话会有更多的存活数据,可能在GC后堆占用空间比会增加。 对于软引用,还是建议尽量少用,会增加存活数据量,增加GC的处理时间。
  13. 晋升年龄阈值:通过-XX:MaxTenuringThreshold指定,默认值15。一般新生对象经过15次Young GC会晋升到老年代,巨型对象会直接分配在老年代,同时在Young GC时,如果相同age的对象占Survivors空间的比例超过 -XX:TargetSurvivorRatio的值(默认50%),则会自动将此次晋升年龄阈值设置为此age的值,所有年龄超过此值的对象都会被晋升到老年代,此举可能会导致老年代需要不少空间应对此种晋升。一般这个值不需要额外调整。

G1调优常用参数及其作用相关推荐

  1. Mysql性能调优常用参数配置

    全文中一共有常用的(事实上你如果花1-2周阅读.理解.自己动手设一下后是需要这么多参数的)76个参数 可能你从未看到过这样的一篇集中火力式的把mysql参数列了这么全的文章.因此这一篇是汇集了最精华和 ...

  2. JVM调优常用参数配置

    2019独角兽企业重金招聘Python工程师标准>>> 堆配置 -Xms:初始堆大小 -Xms:最大堆大小 -XX:NewSize=n:设置年轻代大小 -XX:NewRatio=n: ...

  3. Java虚拟机学习总结(4)—— JVM 性能调优常用参数详解

    前言 在JVM性能调优时有三个组件: 堆大小调整(内存最够大的话,尽量搞大点) 垃圾收集器调整 JIT 编译器(比较深,需要掌握源码才能更好的优化更加底层) 大多数调优选项都与调整堆大小和为您的情况选 ...

  4. java gc调优常用参数_常用JVM调优参数

    JVM调优有许多参数优化,下面整理了一些我自己能够理解的参数 -XX:AutoBoxCacheMax -XX:+AlwaysPreTouch CMSInitiatingOccupancyFractio ...

  5. JVM调优和参数配置

    1.JVM垃圾回收的时候如何确定垃圾?是否知道什么是GC Roots    答:什么是垃圾:简单的说就是内存中已经不再被使用到的空间就是垃圾        要进行垃圾回收,如何判断一个对象是否可以被回 ...

  6. Oracle Hints,Oracle并行模式(Parallel) /*+parallel(t,4)*/ 在SQL调优中的重要作用

    /*+parallel(t,4)*/在SQL调优中的重要作用! 2013年11月17日 12:59:24 雾里看花5566 阅读数:5422更多 个人分类: 数据库-oracle 谈谈HINT /*+ ...

  7. jvm监控调优常用命令

    jvm监控调优常用命令 转载于:https://www.cnblogs.com/likun10579/p/6403324.html

  8. 应用调优常用技巧-線程池

    应用调优常用技巧-線程池 应用调优常用技巧 - 线程池 線程池的好處 核心API-操作類 核心API-監控類 2-2 线程池BlockingQueue详解.选择与调优 調優技巧 2-3 线程池Sche ...

  9. 通过大规模机器学习自动调优数据库参数

    目录 1. 引言 2. 挑战 3. 系统概览 3.1 举例 3.2 假设和限制 4. 工作负载识别 4.1 统计收集 4.2 修剪冗余监控指标 5. 识别重要的参数 5.1 使用Lasso进行特征选择 ...

最新文章

  1. 弹性布局,自动按比例居中
  2. ArgoCD + KubeVela:以开发者为中心的 GitOps
  3. springboot项目打包成war并在tomcat上运行的步骤
  4. H5开发开发利器——flex
  5. [译]Speeding up your PHP scripts
  6. 经典算法(5)- 用二进制方法实现扩展的最大公约数(Extended GCD)
  7. leetcode199. 二叉树的右视图(层序遍历03)
  8. JS对象拷贝:深拷贝和浅拷贝
  9. 一维卷积神经网络原理,卷积神经网络原理简述
  10. 解决硬盘打不开的问题
  11. SAP用户研讨会嘉宾发言稿——SAP中国产品技术平台咨询经理丁晓枫
  12. ubuntu 校准时间_ubuntu server自动校正时间 | 学步园
  13. 搜索引擎的技术发展趋势
  14. 周爱民:真正的架构师是没有title的
  15. ESP8266 WIFI模块学习之路(7)——自写Android手机APP接受单片机数据
  16. windows server2012软路由
  17. esp8266 SDK相关资料
  18. C++ - 多态(2) | 虚表的打印、单继承与多继承的虚表
  19. 商业结算中的本票、支票、汇票
  20. python2和python3实现在图片上加汉字

热门文章

  1. 牛刀小试基本语法,Go lang1.18入门精炼教程,由白丁入鸿儒,go lang基本语法和变量的使用EP02
  2. 论OpenVZ与KVM的区别
  3. 如何制作一个自定义的winpe?
  4. 剑指OFFER——正则表达式匹配
  5. 详谈机器视觉大师脚本编程
  6. 科技云报道:超融合遍地开花,用户离“云计算自由”却依然很远?
  7. java删除图片杂色_Java生成图片,Graphics生成图片,Graphics2D生成图片,Awt生成图片
  8. MY DAILY LIFE
  9. Android OpenGL ES 基础原理
  10. 字体随浏览器缩放变化