背景:
生产环境多台业务服务器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
7,jmap -histo:live pid | head -20 查询出内存占用最大的20个对象,发现排第一的是byte[] 数组,内存占比56%,出现次数仅占0.4%
初步调查结果:
某个业务异常导致大对象频繁创建,而from和to区过小,导致对象直接进入old区,从而触发频繁的fullGC
未完待续。。。