排查java进程cpu100%的大致过程
之前遇到过
之前也遇到过cpu 100%的问题,原因是while循环,死循环了,一直占有cpu。
cpu为什么会100%
我们都知道cpu是时分(time division)的,操作系统里有很多线程,每个线程的运行时间由cpu决定,cpu会分给每个线程一个时间片,时间片是一个很短的时间长度,
如果在时间片内,线程一直占有,则是100%;
我们应该意识到,cpu运行速度很快(主频非常高),除非密集型耗费cpu的运算,其它类型任务都会在小于时间片的时间内结束。
cpu 100%大致排查过程
排查java cpu100%的问题,大致步骤是固定的,
首先找到占用cpu的进程,
如果是java进程,
则继续查看是哪个线程占用cpu,
然后根据线程id从线程栈中找到对应线程栈,
到这里,问题基本也就解决了。
故事背景
今天后台管理系统出现cpu 100%,这个问题间歇性出现,后台管理系统使用ssm(spring+springmvc+mybatis)+shiro实现,用户量很小,所以可以排除高并发导致。接下来,我们按照前述排查步骤,进行排查。
找到cpu 100%的进程
登录linux服务器找到占用cpu的进程,使用top
top
找出服务器的所有java进程,
ps -ef | grep java
或者使用
jps
经对比,占用cpu的进程是java进程,继续挖,找出占用CPU的线程
top -H -p pid
-H表示以线程的维度展示,默认以进程维度展示。
一共4个占用cpu的