最近在项目中碰到某个主机CPU突然干到4000%+的情况,且长时间降不下来,在此记录一下问题定位过程和方法
 
1. 通过 top -p 8510 【java进程ID为8510】 过滤 进程监控列表,按H可以看到 当前java进程中每个线程的繁忙程度。【实际项目未截图,这里是测试环境的截图】
 使用printf %X 命令将 1935 转成16进制,078F。 在我的项目中实际的是  2143
 2. 使用jstack命令,将java进程的线程运行状况导出来  jstack 8510 > /usr/tomcat.stack
 在tomcat.stack文件里查看2143线程的执行内容,发现线程为GC线程.。 因此怀疑是一直gc导致cpu飙升
3. 通过jstat -gc  5000 1000 命令发现,基本上几秒钟就会发生一次fullgc。确认cpu飙高是由于fullgc导致的。
 接下来进一步分析:如此频繁fullgc,应该是发生了内存溢出或者其他问题。
4. 通过 jmap -dump:format=b,file=/usr/tomcat.hprof 8510 导出内存快照,使用jvisualvm查看
 发现了某个业务对象出现了大概 11万多,明显超出了正常范围。
 经过和同事沟通得知,有个功能会触发所有数据库记录的查询,并且放到List中一条一条处理,并且多次点击按钮时候会启动多个线程同时处理,导致内存发生溢出。此处使用线程池限制一下线程数量+分批加载处理即可
                     
5. 以上是问题分析和解决过程。请大家多多沟通和评论哦