JVM频繁Full GC导致服务不可用定位过程
背景:
公司推行微服务策略,我负责的XX模块相对于其他业务来讲相对独立,所以作为微服务推行的试点。于是
- 分析业务边界 ;
- 做相关的架构升级:
- 从Spring3.X升级到Spring5.X(引入了SpringBoot2.0)
- 从JDK7升级到JDK8(老年代被MetaSpace取代)
- ShardingJDBC从1.4版本升级到3.00.M1版本
问题描述:
重构系统上线后,发现运行一段时间后,系统会出现频繁的Full GC,频率几乎1秒一次,导致服务长时间卡死(10+mins到30+mins不等),但是卡死一段时间后会恢复,再运行一段时间,服务会被Linux内核kill了。
JVM启动参数配置:
java -Dspring.profiles.active=prod -server -Xms4g -Xmx4g -Xmn2g -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m -XX:+UseParallelGC -XX:+UseParallelOldGC -verbose:gc -Xloggc:/mnt/gc.log -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintHeapAtGC -XX:+PrintGCDateStamps -XX:+HeapDumpOnOutOfMemo