情況一、內存空間不足
對比監控出現性能毛刺時間點的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