JVM FULLGC频繁的案例1笔记

 原创   
营养快线送你 2021-09-02 学习笔记
0 0 0 470

1.事故现场:

FULLGC每隔几分钟就触发一次,导致用户每隔几分钟就卡顿一次。FULLGC会引发STW机制(STW: STOP-THE-WORLD),所有用户线程挂起等待FULLGC进行垃圾回收,而且时间长,所有实际用户请求耗时变长,所以要尽量避免FULLGC。

2.案例分析

发生在订单系统,平时运行的好好的。但是高并发下,每秒下300单,就会每隔几分钟触发一次FULLGC。

对订单系统分析,评估下单接口创建的所有对象,调用一次接口所有对象总共会产生多少内存,假设20K,然后300单就是产生6M对象内存,1秒内系统还会处理其他查询请求等,再扩大10被,那么每秒就会产生60M对象内存。

当时的jvm堆内存分配情况:

安装正常情况,接口快速处理完,线程关闭,60M对象内存就变成垃圾内存进入eden,eden内存每隔14秒就满一次,触发回收(叫minorGC),这个过程很快,eden会迅速释放这60M内存。正常情况下,这是一个良性循环。

问题发生的原因:minorGC也会触发STW机制,虽然这个时间极短,但高并发情况下,可能会有一个时间点的线程都被挂起,这些线程产出的60M对象还存活着,eden将这些对象移到s0,60M超过了100M的50%,认为是大对象直接移到old老年代。每隔14秒就往老年代移60M对象,几分钟老年代就满了,于是触发FULLGC。

解决方案:

1.修改年轻代eden和survivor比例,上述为8:1:1,改为6:2:2即可。

2.修改年轻代和老年代的内存,年轻代1G变2G,老年代2G变1G。视频上说的是这种方法,但个人感觉不好,eden的minorGC时间会变长,可能会导致2个时间点的对象挂起,120M那么不是还是超过200M的50%。

学习JVM应用笔记:https://b23.tv/Dm61xy

收获很大