系统频繁Full GC,导致系统卡顿

4 篇文章 0 订阅
3 篇文章 0 订阅

本人自己在云服务器上部署了个应用,都要忘了这么回事了,突然打开发现特别卡顿,

数据量并不多,内存也是够用的,访问量也并不高,就时快时慢的问题

以下是机器配置以及统计到的数据

机器配置:2核4G

JVM内存大小:2G

系统运行时间:7天

期间发生的FullGC次数和耗时:500多次,200多秒

期间发生的YoungGC次数和耗时:1万多次,500多秒

大致算下来每天会发生70多次FullGC,平均每小时3次,每次FullGC在400毫秒左右;每天会发生1000多次YoungGC,每分钟会发生1次,每次YoungGC在50毫秒左右。

以下是jvm设置参数

-Xms1536M
‐Xmx1536M
‐Xmn512M
‐Xss256K
‐XX:SurvivorRatio=6
‐XX:MetaspaceSize=256M
‐XX:MaxMetaspaceSize=256M
2
‐XX:+UseParNewGC
‐XX:+UseConcMarkSweepGC
‐XX:CMSInitiatingOccupancyFraction=75
‐XX:+UseCMSInitiatingOccupancyOnly

经过分析感觉可能会由于对象动态年龄判断机制导致fullgc较为频繁,说明年轻代空间太小,需要大量的对象挪到老年代,所以增加了年轻代的空间,调整后如下

-Xms1536M
‐Xmx1536M
‐Xmn1024M
‐Xss256K
‐XX:SurvivorRatio=6
‐XX:MetaspaceSize=256M
‐XX:MaxMetaspaceSize=256M
2
‐XX:+UseParNewGC
‐XX:+UseConcMarkSweepGC
‐XX:CMSInitiatingOccupancyFraction=92
‐XX:+UseCMSInitiatingOccupancyOnly

是不是以为优化完结束了,不,你错了,完全没有好转,反而根据监控显示,更加严重

这个时候,就又继续尝试,full gc太多的原因大概分为两种,

1:手动调用System.gc() 

2:元空间不够,也就是方法区

然后我继续做了相应调整  使用-XX:+DisableExplicitGC,这个是禁用手动GC的,设置了以后你手动gc也没用,顺便增加了元空间的大小

不出所料,并没有什么用,并且得到了一个重要信息,看到大量的对象从年轻代移动到老年代,这个时候我用jmap命令查到了这个对象是user,然后继续用jvisualvm来定位到了代码,是一个用户导入的功能,然后对功能做了相应的优化,分批导入

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

戒不掉旳人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值