本次的事故是程序部署在k8s,程序启动后就报cpu占用率过高,重启后也一样

  1. 首先使用top命令查看CPU占用高的java程序pid
  2. 使用jdk自带的工具,执行命令 jstack [pid] > temp.txt 将进程的线程信息放入 temp.txt文件中
  3. 再次筛查,使用命令 top -p [pid] -H 查看这个程序中各pid运行情况,找到占用cpu过高 pid
  4. 使用命令 printf 0x%x [pid] 转成16进制,然后使用16进制的值在temp.txt文件中搜索,看这个线程在干嘛
  5. 我本次的问题是,这个线程负责的是jvm gc的
  6. 排查gc日志,可以看到存在高频率的full gc
  7. 开始分析堆转存文件,查看哪块地方占用内存过多,结果发现是运行时动态配置数据缓存较大,程序启动时配置的jvm内容太小,导致无法存入配置数据,不停的触发full gc
  8. 最终将jvm内存调大后,监测一段时间的gc日志,结果是gc日志正常了,cpu占用率也降下来了