java fgc_记一次频繁FGC的简单排查

java fgc_记一次频繁FGC的简单排查简书占小狼转载请注明原创出处,谢谢!如果读完觉得有收获的话,欢迎点赞加关注周末愉快,今天有时间记录一下上周遇到的一个问题,学习的脚步不能放慢,也不敢放慢。存在问题在线上环境进行服务压测,压测完成后,cpu使用率居高不下,很是费解,按理说已经没有压测请求了,这时消耗cpu资源的只有GC线程了,可以通过jstat命令查看一下JVM的GC情况,然后就碰到了诡异的GC问题。jstat命令jstat[…

大家好,又见面了,我是你们的朋友全栈君。

简书 占小狼

转载请注明原创出处,谢谢!

如果读完觉得有收获的话,欢迎点赞加关注

周末愉快,今天有时间记录一下上周遇到的一个问题,学习的脚步不能放慢,也不敢放慢。

2304f0ba412d

存在问题

在线上环境进行服务压测,压测完成后,cpu使用率居高不下,很是费解,按理说已经没有压测请求了,这时消耗cpu资源的只有GC线程了,可以通过jstat命令查看一下JVM的GC情况,然后就碰到了诡异的GC问题。

jstat命令

jstat [ generalOption | outputOptions vmid [interval[s|ms] [count]] ]

参数:

generalOption: 一般使用-gcutil查看GC情况

vmid: 虚拟机进程号,即当前运行的java进程号

interval: 间隔时间,单位为秒或毫秒

count: 打印次数,如果缺省则打印无数次

执行jstat -gcutil 9132 1000命令,线上服务器的GC情况如下:

2304f0ba412d

参数说明如下:

S0: 新生代中Survivor space 0区已使用空间的百分比

S1: 新生代中Survivor space 1区已使用空间的百分比

E: 新生代已使用空间的百分比

O: 老年代已使用空间的百分比

P: 永久带已使用空间的百分比

YGC: 从应用程序启动到当前,发生Yang GC 的次数

YGCT: 从应用程序启动到当前,Yang GC所用的时间【单位秒】

FGC: 从应用程序启动到当前,发生Full GC的次数

FGCT: 从应用程序启动到当前,Full GC所用的时间

GCT: 从应用程序启动到当前,用于垃圾回收的总时间【单位秒】

问题分析

通过打印的GC数据可以看出,JVM一直在进行FGC(cms gc),不过老年代的使用率反而没有下降,一直稳定在60.16%,对这一情况很疑惑,几乎每次都重现,后来去仔细查看了JVM的启动参数,发现其中CMSInitiatingOcupancyFraction参数,被设置成60,意味着当老年代的使用率达到阈值60%时会触发FGC,但是FGC之后,老年代的使用率还是大于60%,所以会不断的进行FGC,建议这个值不要设置的这么小。

至于为什么FGC之后,老年代的使用率没有下降,可以通过dump查看到底是哪些存活对象在作怪,在进行FGC时,通常会伴随着一次YGC,但这也不是一定的,如果执行YGC之后没有明显效果的话,会设置一个变量,表明下次不用进行YGC,所以如果老年代如果存在大量对象的GC ROOT在新生代的话,这些对象就不会被回收,这种情况必须强制执行一次YGC之后,才有可能回收这些老年代的对象,比如添加参数-XX:+CMSScavengeBeforeRemark,就可以解这个问题。

昨天正好笨神也遇到类似的问题,并写一篇文章《又抓了一个导致频繁GC的鬼–数组动态扩容》进行分析,可以参考一下。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/150785.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 一键ghost备份不了的原因_ghost系统恢复

    一键ghost备份不了的原因_ghost系统恢复大家都有想要给重要的东西备份吧,系统也是可以备份还原的,小编这里给大家分享一键Ghost备份还原系统的方法,如果你有需要对系统进行备份或还原就可以用这个一键备份还原方法了。一键Ghost备份还原备份的系统镜像不仅可以在本机进行还原还可以在其他的电脑上还原操作系统,很多朋友需要对系统备份不知道怎么操作,小编接下来就给大家详细介绍操作方法。Ghost系统的备份:1、系统之家一键重装系统是一个非常受欢迎…

    2025年9月18日
    4
  • Min Stack

    Min Stack

    2021年9月8日
    56
  • jmeter  内置日期函数常用方式

    jmeter  内置日期函数常用方式

    2021年9月18日
    47
  • 2012服务器系统密钥,WINDOWS SERVER 2012标准版密钥[通俗易懂]

    2012服务器系统密钥,WINDOWS SERVER 2012标准版密钥[通俗易懂]js获取浏览器内核、类型、版本以及系统类型正则表达式:varrsys=/\b(windows|win32|macintosh|macosx|adobeair|linux|unix)\b/;varrkn=/\b(opera|…docker组件(c/s)Docker组件1.dockerclient:docker…

    2022年8月31日
    5
  • CISCO mds FC光纤交换机配置参考资料

    CISCO mds FC光纤交换机配置参考资料(一)有几个概念必须明确一下(与brocade不同的地方):(1)brocade直接划分zone.而mds要在vsan下划分zone,mds可以先划分几个vsan,每个vsan包括几个zone.(2)brocase默认的端口是打开的,而mds默认的端口是关闭的(3)mds有一个默认的zone:”TheDefaultZo…

    2022年5月11日
    54
  • 京东准点秒杀脚本[通俗易懂]

    京东准点秒杀脚本[通俗易懂]转载自:https://blog.csdn.net/tangcv/article/details/102993939直接上菜1.浏览器打开https://www.jd.com/,登录京东2.选择要抢购的商品3.按键盘F12,打开开发者模式,选择Console选项卡4.把以下代码粘贴在Console里面,修改代码里开始抢购时间(有二处时间)varnIn…

    2022年6月16日
    39

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号