前续:
1、尝试调优kafka消费端模块:
首先通过 jstat 配合 watch 命令监听程序GC情况:
watch -n [间隔时间] -d "jstat -gc [pid]"
监听与分析发现:
- YGC频率较为频繁,基本都在每秒5~10次。
- 堆空间新生代与老年代、Eden区与Survivor区 内存分配不合理:
程序新生代对象创建速率非常大,但是基本都是朝生夕逝,只有极少量能在survivor区生存一定年龄,而能达到15进入老年代的更是少之又少。
查询启动配置项,发现JVM没有配置堆内存各代占比参数,只是配置了整体堆空间为4G。
这就意味着会执行JVM默认配置:
- New:Survivor = 8: 1 : 1
- Old : New = 2 :1
分析认为该程序对4G内存的利用率低下,需要进行内存占比调整。通过调整参数-XX:SurvivorRatio、-XX:NewRatio甚至-Xmn使新生代比老年代占比大,尽量使Eden区大小设置在合理的范围,最终调整为:
-Xmx4096m -Xms4096m -Xmn2560m -XX:SurvivorRatio=23
该参数配置达到效果:
- YGC频率降低到1~2次每秒,FGC平均半天执行一次
后续尝试调整了一些-XX:ParallelGCThreads等参数,效果不大,不再记录。