背景及问题现象
程序背景:该程序为基于HTTP协议开发,实现了数据订阅接收的功能
问题现象:大量的数据接收,出现了数据堆积的问题
问题排查过程
现场环境JVM配置参数如下图:
JVM参数分析
JVM中新生代和堆内存的大小配置不合理,新生代只有256M会频繁导致YGC,堆内存的设置初始值512M,最大值2048M,会导致处理速度波动。
FGC在以3秒左右的周期出发,导致大量时间停顿,发现FGC的次数在4天内达到了124398次,STW的时间达到了159037.355秒,高达44个小时
JVM参数对程序效率影响的验证
简单进行JVM参数调整
将新生代调整为1024M,堆大小调整为10240M
修改后的JVM,YGC的频率为3秒,FGC频率明显下降,测试中只出现了13次 ,说明JVM参数对程序性能有较大影响
JVM进一步调优
第一次调优
继续修改参数,将新生代10240M,堆大小设置为30720M
修改后的JVM,YGC的频率为40秒,FGC在测试中没有出现,但是老年代中对象大小随着YGC不断变大,监控如下
第二次调优
再次调节JVM的垃圾回收策略为G1GC
修改后的JVM,YGC的频率为70秒,FGC在测试中没有出现,老年代中对象增长速率明显下降,内存空间由G1自动调节,避免内存浪费,监控如下
最终结论
如上图对JVM的监控,经过对JVM的优化,现场环境稳定,性能可以承受现场发送的数据量,不再产生数据堆积。