背景介绍
1、项目组成: k8s+docker+springboot+jdk1.8
2、问题描述: 在一次线上环境升级后springboot项目服务(pod)频繁重启,间隔时间较短,甚至于项目启动后又立即重启
问题排查
1、查看pod事件:kubectl -n xxx get event
2、查看pod内容:kubectl -n xxx describe pod xxxx
重启原因是oomkilled
3、检查项目代码 :没有发现可能导致内存泄漏的代码
4、查看pod使用内存:kubectl -n xxx top pod
5、查看java堆栈信息: 使用jstack pid
jstat -gc pid 1s 2
jamap -heap pid
java -XX:+PrintFlagsFinal -version|grep HeapSize
等命令检查内存使用情况,发现jvm初始化的内存(32g)远大于k8s分配的内存大小(4g)于是网上查找了一下资料:
https://blog.csdn.net/yzh_1346983557/article/details/89216494
https://blog.csdn.net/zhangxiangui40542/article/details/119862437
结论
做了实际验证,发现在没有对jvm的参数做配置时,jvm分配的堆栈大小是根据宿主机内存进行分配的;
在制作docker镜像的时,对jvm的参数进行配置java -Xms1024m -Xmx1024m -jar app.jar
问题得以解决;
备注: 以上两位博主的观点不一致,是不是和k8s的环境配置有关不得而知;