情况一、内存空间不足
对比监控出现性能毛刺时间点的GC日志和业务日志,发现JVM停顿了较长时间,且停顿时GC日志中有大量的“Allocation Stall”日志。
原因就是堆内存被占满,导致部分线程阻塞,如下图中的 High used已经达到100%
解决办法:
1.最直接有效的办法就是增加堆大小
2.增加jvm参数 -XX:ZAllocationSpikeTolerance。调整正态分布模型预测系数ZAllocationSpikeTolerance默认值为2,值越大,越早的触发GC。优化后设置成5,xmx和xms可以考虑设置成不一样的值
3.还可以尝试 增加固定gc间隔 -XX:ZCollectionInterval 参数
情况二、gc初始化空间不足
背景:一个62G物理机上部署了2个24G的xmx的java进程
发生Application的时候,前后都没有占到情况一中占用达到100%的情况
原因:观察gc日志,在初始化阶段发现
可以看出,jvm的堆初始化的时候,tmpfs -> /dev/shm 下面的可用空间不足(当然和具体的机器有关)。。限制一下其他使用tmpfs地方或者调整一下tmpfs大小
最后附上一篇zgc调优:https://tech.meituan.com/2020/08/06/new-zgc-practice-in-meituan.html