线上跑的几台服务器突然出现大量fgc,由于在fgc过程的stop the world太久,引起其它应用访问该服务器上的接口大量超时。(发生超时的时间点和fgc时间点一致)
先进行初步的优化。
方案:修改CMSInitiatingOccupancyFraction=85这个调低到60,加快cms gc处理防止concurrent mode failure触发FGC,
减少CMSMaxAbortablePrecleanTime到500以缩短PreClean时间。
修改mn2560m为2048,让eden小于old。
但是修改后效果不大,于是分析FGC产生的根本原因:
突然发生频繁fgc的时间点为是有一个新上业务,该业务每五分钟dump一次词表,然后在本地jvm内解压,一次1G多的数据,然后下一次再更新词表时原词表摒弃。也就是每5分钟就会产生1g多的垃圾,而且是突发式的,不是说慢慢累积到1G,而是在新词表数据下载后瞬间抛弃原词表数据,这样大的垃圾回收确实需要一定处理时间。这样的业务如果靠 优化参数,起的作用杯水车薪 ,只能优化业务。后来了解5分钟更新一次本身就是配置错误,修改为正常频率后2小时产生一次fgc,完全正常。
大量数据更新导致fgc频繁引起jvm服务暂停。
时间: 2024-10-06 15:10:49