0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

G1调优时可调整的参数

科技绿洲 来源:了不起 作者:了不起 2023-09-25 14:26 次阅读

最近线上服务运行比较缓慢,老大提出让我进行JVM优化。GC的内容很多,也不可能一时间全部都掌握,今天就要看看G1的一些知识,还有调优时可调整的参数

1.G1简介

G1的全称为 Garbage First Garbage Collector, 是一款内置在HotSpot JVM中的服务端垃圾收集器。

G1是作为CMS的替代产品出现的,其目标是在满足最短时间停顿的同时达到一个高吞吐量,适用于多核处理器,大内存容量的系统。

其特点如下:

  • 短停顿时间且可控。对内存进行分区,可以应用在大内存系统中,其使用了基于内存的新生代收集和混合收集。
  • 高吞吐量。设计了新的并发标记线程,并发处理分区之间的引用关系,加快垃圾回收速度。

1.1分区

G1垃圾回收器将堆内存划分成固定大小的Region,下图为G1内存的分配示意图,其中灰色格子代表一个region。

图片

其中G1的分区可以分为4类:

  1. 自由分区(Free Heap Region, FHR)
  2. 新生代分区(Young Heap Region , YHR) 新生代也分为Eden 和Survivor
  3. 大对象分区(Humongous Heap Region,HHR) 大对象区可分为 大对象头分区和大对象连续分区,大对象一般占Region的一半以上。
  4. 老生代分区(Old Heap Region,OHR)

图片
img

Region可以在1MB~32MB,且为2的N次幂,设定分区大小有以下方法:

  • 可以通过-XX:G1HeapRegionSize=<>来指定大小,默认为0.
  • 默认情况下是将整个堆分为2048个Region。
1.1.1 新生代大小

新生代大小的设置如下:

  • 如果设置了最大值 (MaxNewSize) 和最小值(NewSize), Xmn 等价于MaxNewSize
  • 如果设置了最大值和最小值,又设置了NewRatio 则忽略NewRatio
  • 如果没有设置新生代最大值和最小值,但是设置了NewRatio 则新生代的最大值最小值是相同的,都是整个堆空间的 (NewRatio+1)
  • 如果没有设置新生代最大值和最小值,或者只设置了最大值或者最小值中的一个,那么G1将根据参数G1MaxNewSizePrecent(默认值60) 和 G1NewSizePercent (默认值5)占整个堆空间的比例计算最大值和最小值。

关于堆大小的参数优化:

  • G1HeapRegionSize 可以指定堆的大小,可指定也可以有内存管理启发推断分区大小。
  • xms/xmx 指定堆空间的最小值/最大值, 一定要设置正确的值,否则会影响分区大小推断。
  • G1不要设置MaxNewSize,NewSize,Xmn, NewRatio,即不要显示的设置年轻代的大小 。G1对内存的管理不是连续的,所以即使重新分配一个堆分区的代价不大;G1的目标满足垃圾收集停顿,这需要G1根据停顿时间动态调整收集的分区,如果设置了固定的分区数,G1不能调整新生代的大小,则不容易满足停顿时间的需求。
  • GCTimeRatio指的是GC与应用程序之间的时间占比,默认值是9,表示GC与程序的时间占比为90%,增大该值将减少GC占用时间,增大该值则动态扩展内存会更容易发生。

2.G1 GC可优化参数

G1提供了两种GC模式,Young GC 和 Mixed GC 两种GC都会有STW.

Young GC

主要是对Eden区进行GC ,一般情况下,会在Eden Region使用达到最大阈值时,空间内存不够用时,触发YoungGC。每次Young GC会回收所有的Eden 和Serviour区,并且将存活对象复制到Old区以及一些Survivor区。

Mixed GC

Mixed GC 会选取(并发标记)所有的 Young Region和 回收收益较高的一些 Old Region, 然后进行年轻代回收算法

混合回收分为两个阶段。

  • 并发标记
  • 垃圾回收

其中并发标记阶段可以分为以下几个子阶段:

  • 初始标记子阶段:标记所有直接可达的根对象,此阶段会STW,
  • 并发标记子阶段:YoungGC 执行完成之后,如果满足并发标记的的条件(已分配及将要分配的内存占总内存的比例超过阈值之后),就进行并发标记,其中-XX:ConcGCThreads 控制并发标记线程数量,一个线程每次扫描一个Region。此时标记存活对象,
  • 再标记子阶段:找出所有未被访问的存活对象,此过程为并发执行,并且会有STW,其中-XX:ParallelGCThreads可指定GC暂停时可用的GC线程数。
  • 清理子阶段:需要STW,存活对象计数,整理标记位图,释放完全空闲的分区。

混合回收阶段的参数优化:

  • 参数InitiatingHeapOccupancyPercent(IHOP),默认值时45, 此值时启动并发标记的先决条件,只有已分配内存占总空间超过45%之后,才会启动并发标记任务。增加此值,将导致并发标记可能花费更多的时间,也会让YGC或者MixedGC时收集的分区变少,这样就会导致更多的Full GC。这个值可以根据整体应用占用的平均内存来设置,可以把该值设置的比平均内存稍微高一点。IHOP的设置效果很明显,但是要设置合理的值并不容易,需要更多的性能测试来判断。
  • 参数G1ReservePercent, 默认值是10,如果GC晋升失败导致FullGC,则可以调大该值
  • 参数ConcGCThreads为并发线程数,默认值为0,如果未设置,可以动态调整,并且使用ParallelGCThreads为依据来推断,如果并发标记耗时较大,可以增大并发线程数。
  • HeapSizePerGCThread 默认为64M,表示每64M分配一个线程
  • 参数UseDynamicNumberOfGCThreads,默认为false,设为true表示可以动态调整线程数,调整范围会根据最大线程数,HeapSizePerGCThread确定。
  • 参数GCDrainStackTargetSize,默认值为64,表示并发标记子阶段,一次标记最多标记的最多对象个数。
  • 参数GCMixedGCLiveThresholdPercent 默认值85,用于判断分区能否被加入到CSet中,低于该值将会被加入。
  • 参数G1HeapWastePercent 默认值5,即当Cset中可回收空间 占总空间的比例大于G1HeapWastePercent才会开始混合回收。
  • 参数G1MixedGCCountTarget,默认值为8,这个参数越大,收集老年代的分区越少,反之收集的分区就越多,尽量保持老年代分区在Cset中的比例超过1/G1MixedGCCountTarget。
  • 参数G1OldCSetRegionThresholdPercent 默认值为10,表示最多收集10%的分区。
  • 参数G1ConcMarkStepDurationMillis 默认值为10,表示每个并发标记子阶段最多执行10ms

FullGC发生之后,基本都是串行回收. 如果不幸发生了FullGC, 那么我们能做的就是尽量让FullGC尽快完成,然后降低其频率。但是通常情况下,比较固定且较长时间间隔的FullGC是被允许的。

那么FullGC相关也是有一些优化调整的地方:

  • 使用参数MinHeapFreeRatio 用于判断是否可以扩展堆空间,增大该值扩展的概率就会变小。
  • MaxHeapFreeRatio 判断是否可以收缩空间,增大该值收缩的概率也会变小。
  • MarkSweepAlwaysCompactCount 默认值为4,这个值表示经过一定次数的GC之后,允许当前区域中一定比例的死亡对象当作存活对象处理,暂时不回收,从而加快FullGC的处理流程。这个比例可以使用MarkSweepDeadRatio来修改,默认值为5.

总结

以上是一些优化参数的使用,至于具体调优的目的要根据我们各个程序的要求。一般而言需要满足最大的吞吐量和最小的暂停时间,GC频率尽量低,堆空间的有效利用率高等。可调整的部分有内存参数的优化,引用的处理(Rset),并发标记(Mark),垃圾回收部分。

Oracle官方有一些推荐调优的方向:

  • 针对年轻代的设置,尽量避免明确的设置年轻代的大小(使用-Xmn,-XX:NewRatio等),固定的年轻代大小会覆盖最小停顿时间的目标。
  • 对于暂停时间的目标,我们需要考虑平衡延迟和吞吐量,两者不可兼得,所以需要找到一个最佳的平衡点。
  • 混合回收阶段的优化参数可以考虑率使用 -XX:InitiatingHeapOccupancyPercent 修改内存占用比(具体可以参考前文), -XX:G1MixedGCLiveThresholdPercent 和 -XX:G1HeapWastePercent 改变混合垃圾回收的策略,-XX:G1MixedGCCountTarget 和 -XX:G1OldCSetRegionThresholdPercent 调整老年代在CSet中的占比
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 参数
    +关注

    关注

    11

    文章

    1783

    浏览量

    32079
  • 应用程序
    +关注

    关注

    37

    文章

    3240

    浏览量

    57596
  • 线程
    +关注

    关注

    0

    文章

    504

    浏览量

    19647
  • 服务端
    +关注

    关注

    0

    文章

    66

    浏览量

    6985
  • G1
    G1
    +关注

    关注

    0

    文章

    2

    浏览量

    2319
收藏 人收藏

    评论

    相关推荐

    adp7104是否有一个固定输出或一个可调整输出?

    我能否问一下图片中的设备是否有一个固定输出或一个可调整输出
    发表于 01-05 06:37

    请问无感BLDC的FOC控制中观测器G1G2参数如何确定?

    无感 BLDC 的FOC控制中观测器G1G2参数如何确定?
    发表于 04-19 06:48

    可调整或可编程的模拟输入范围有何优势?

    问:可调整或可编程的模拟输入范围有何优势?
    发表于 11-24 08:28

    可调整的压控调节器闭环电路

    可调整的压控调节器闭环电路
    发表于 02-09 16:13 916次阅读
    <b class='flag-5'>可调整</b>的压控调节器闭环电路

    APEC推出输出电压可调整的升压转换器APE1911MP

    APEC推出输出电压可调整的升压转换器APE1911MP 富鼎先进(APEC )推出一款高效率且输出电压可调整的升压转换器,其操作频率为500KHZ且内
    发表于 03-22 15:11 669次阅读

    PWM程序占空比和周期可调整(经过proteus仿真)资料下载

    PWM程序占空比和周期可调整(经过proteus仿真)资料
    发表于 04-13 15:44 145次下载

    Alluxio线程池结构与吞吐量

    本文介绍了 Alluxio Master 的线程池结构与每个线程的功能。在过程中,利用分析结果调整审计日志的 blocking queue,调整 UFS-SYNC-PREFETCH
    发表于 11-11 11:36 578次阅读

    35W(可调整)移动电源快充方案!使用智融SW7201/SW3516

    35W(可调整)移动电源快充方案!使用智融SW7201/SW3516
    的头像 发表于 06-19 19:11 1800次阅读
    35W(<b class='flag-5'>可调整</b>)移动电源快充方案!使用智融SW7201/SW3516

    RH3083MK:可调整的2.8A单抗力低辍学率数据表 RH3083MK:可调整的2.8A单抗力低辍学率数据表

    电子发烧友网为你提供ADI(ADI)RH3083MK:可调整的2.8A单抗力低辍学率数据表相关产品参数、数据手册,更有RH3083MK:可调整的2.8A单抗力低辍学率数据表的引脚图、接线图、封装手册
    发表于 10-07 17:51
    RH3083MK:<b class='flag-5'>可调整</b>的2.8A单抗力低辍学率数据表 RH3083MK:<b class='flag-5'>可调整</b>的2.8A单抗力低辍学率数据表

    RHH11885AMK:采用可调整的当前限制数据表的负监管 RHH11885AMK:采用可调整的当前限制数据表的负监管

    电子发烧友网为你提供ADI(ADI)RHH11885AMK:采用可调整的当前限制数据表的负监管相关产品参数、数据手册,更有RHH11885AMK:采用可调整的当前限制数据表的负监管的引脚图、接线图
    发表于 10-07 17:53
    RHH11885AMK:采用<b class='flag-5'>可调整</b>的当前限制数据表的负监管 RHH11885AMK:采用<b class='flag-5'>可调整</b>的当前限制数据表的负监管

    RHH1085:3A 低辍学率阳性可调整监管数据表 RHH1085:3A 低辍学率阳性可调整监管数据表

    电子发烧友网为你提供ADI(ADI)RHH1085:3A 低辍学率阳性可调整监管数据表相关产品参数、数据手册,更有RHH1085:3A 低辍学率阳性可调整监管数据表的引脚图、接线图、封装手册、中文
    发表于 10-07 17:53
    RHH1085:3A 低辍学率阳性<b class='flag-5'>可调整</b>监管数据表 RHH1085:3A 低辍学率阳性<b class='flag-5'>可调整</b>监管数据表

    RHR137:负可调整监管数据表 ADI

    电子发烧友网为你提供ADI(ADI)RHR137:负可调整监管数据表相关产品参数、数据手册,更有RHR137:负可调整监管数据表的引脚图、接线图、封装手册、中文资料、英文资料,RHR137:负
    发表于 10-08 16:03
    RHR137:负<b class='flag-5'>可调整</b>监管数据表 ADI

    ADUM3195:配有可调整收益和单项产出数据表的单独放大器 ADI

    电子发烧友网为你提供ADI(ADI)ADUM3195:配有可调整收益和单项产出数据表的单独放大器相关产品参数、数据手册,更有ADUM3195:配有可调整收益和单项产出数据表的单独放大器的引脚图
    发表于 10-10 18:40
    ADUM3195:配有<b class='flag-5'>可调整</b>收益和单项产出数据表的单独放大器 ADI

    jvm参数

    JVM(Java虚拟机)是Java程序的运行环境,它负责解释Java字节码并执行相应的指令。为了提高应用程序的性能和稳定性,我们可以JVM的参数。 JVM
    的头像 发表于 12-05 11:29 594次阅读

    jvm参数的设置和jvm

    JVM(Java虚拟机)参数的设置和对于提高Java应用程序的性能和稳定性非常重要。在本文中,我们将详细介绍JVM参数的设置和
    的头像 发表于 12-05 11:36 1419次阅读