G1垃圾收集器,调优原理详解

传统的GC调优会从三个方面去考虑:

  • 低延迟
  • 高吞吐量
  • 高内存

但这三个方面无法都做到,高内存必然导致内存中垃圾增多,延迟就会升高,而G1解决了这个问题,garbage first让你可以在规定时间内收集垃圾最多的区块,最大限度的提升回收效率,在低延迟的情况下,还能做到高内存。

关于G1是新开始使用的垃圾回收器,在G1垃圾回收器进行回收的时候,怎么样设置JVM启动参数,怎么对G1进行调优,楼主看了网络上的文章都不尽如人意,所以我想在此写一篇比较贴合实际的文章,能让大家看了在实战中去使用,从各个方面去优化G1的gc参数。
其实提到G1的gc参数的优化,主要从几个方面说起:

  • 低延迟
  • 吞吐量
  • 高内存

一、低延迟

如果gc参数配置不合理,在相同时间内应用线程的停止时间可能一个是5s,一个是5ms,那怎么去优化服务停止时间呢,通过分析GC日志。
关于延迟是否能达到要求,只需要去GC日志中统计总的暂停时间,然后与jvm启动的总时间的比例是否满足业务需求,GC日志中是没有统计总的暂停时间的,只是记录了每次GC的暂停时间,这就需要你自己写程序去统计总的GC暂停时间。

如果延迟过高,解决办法如下:

  • 设置-XX:MaxGCPauseMillis = n:这个参数非常重要,用来限制最大的GC暂停时间,目的是尽量不影响请求处理的响应时间。G1将根据先前收集的信息以及检测到的垃圾量,估计它可以收集的最大区域数量,从而保证GC时间不会超出这个限制。因此G1相对来说更加“智能”,使用起来更加简单。

  • 也正是因为可以在规定时间内收集垃圾,收集器可以预先计算收集那些最多区块的垃圾,所以才叫Garbage First。否则内存过大必然导致垃圾收集暂停时间增长,造成高延迟情况。

    低延迟是否代表着高吞吐量呢,其实不然,低延迟也可能因为内存比较少,这会导致GC比较频繁,也会造成吞吐量较低

二、吞吐量

吞吐量低了,可能是因为内存太低,导致频繁GC,频繁STW,STW时间增多,所以导致吞吐量降低。

三、高内存

有时候需要给JVM配置比较高的内存,避免频繁的GC,当配置了高内存后,一般的垃圾收集器都会造成高延迟,而G1的-XX:MaxGCPauseMillis = n参数可以保证延迟还保持在固定时间内,并且由于G1的特性,有优先收集垃圾较多的区域,还会提升吞吐量

发布了188 篇原创文章 · 获赞 117 · 访问量 38万+

猜你喜欢

转载自blog.csdn.net/lz710117239/article/details/101392027