生产环境CPU飙升

521 阅读1分钟

背景:

生产环境多台业务服务器cpu飙升到700多,触发服务器报警

应急方案:

分批重启

问题的调查与分析:

1,top 命令找到cpu高的进程

2,top -hp pid 找到cpu高的线程pid,转换为16进制

3,jstack 打印出线程的堆栈信息,用cpu高的线程pid过滤,找到cpu高的线程的堆栈信息

4,结果显示cpu占用最高的是GC线程,确定了是因为GC导致的cpu飙升,下一步定位频繁GC的原因

5,jstat -gc pid 5000 打印出GC日志,发现fullGC执行了三万多次,我滴神呀!

6,jmap -heap pid打印出jvm参数,这里就发现了一个比较奇怪的问题,我们survivorRatio = 8, eden:from:to = 8:1:1,算下来from和to最少也应该100M以上,但是这里显示只有33M

微信图片_20210630213653.jpg

7,jmap -histo:live pid | head -20 查询出内存占用最大的20个对象,发现排第一的是byte[] 数组,内存占比56%,出现次数仅占0.4%

初步调查结果:

某个业务异常导致大对象频繁创建,而from和to区过小,导致对象直接进入old区,从而触发频繁的fullGC

未完待续。。。