一、问题现场
在项目中有一个单节点的task服务,这服务有由于架构原因无法实现多节点部署,该服务每隔2个月左右时间会出现异常,内存一直飙升,但jvm 并没有进行full gc ,直至服务tomcat 出现假死,服务异常。
二、问题分析
该服务节点以前是在物理机上运行,最近我们将该服务部署到了docker 容器中,并且将jdk从1.6升级到了1.8,然后就出现了上述问题。
- 出现问题我们接入了公司统一的jvm监控平台,并配置了jvm内存使用量监控;
- 通过jvm内存监控发现:堆内存不断飙升的时候,但是没有触发full gc;
- 通过jmap导出,堆栈快照的时候没有发现异常信息;
- 发现服务用的是jdk 1.8 默认的垃圾收集器:Parrallel GC
三、解决方案
- 找运维配置一台8g 内存8核CPU 的docker 容器;
- 将默认 Parrallel GC 更换为 CMS GC ;
- 加jvm堆栈监控日志,用于分析生产环境GC 情况;
四、jvm参数设置
4.1 配置jvm参数
echo "origin OPTS is: $CATALINA_OPTS"
CATALINA_OPTS="$CATALINA_OPTS -Xms2048m -Xmx4096m -XX:NewSize=1g -XX:MaxNewSize=1g"
JAVA_OPTS="$JAVA_OP