java线上服务排查cpu飙升
# cpu飙高产生的原因
1. CAS 自旋没有控制自旋次数。
2. 程序中存在死循环或者无限递归:如果程序中存在死循环或者无限递归,会导致 CPU不断执行相同的操作,造成 CPU 飙高。
3. 大量的线程竞争和锁等待:如果程序中存在大量的线程竞争和锁等待,CPU 在不断切换线程和处理锁等待的过程中会消耗大量的时间和资源,导致 CPU 使用率升高
4. 服务器被 DDOS 工具攻击。
5. 频繁的垃圾回收:如果程序中存在内存泄漏或者频繁创建大量的临时对象,垃圾回收器就需要频繁进行垃圾回收操作,从而占用较高的 CPU 资源。
6. 长时间阻塞的 I/O 操作:如果程序中存在长时间阻塞的 I/O 操作(如网络请求、数据库查询等),CPU 可能会在等待这些操作完成时处于空闲状态,但是仍然会产生较高的 CPU 使用率。
# cpu飙升排查步骤
1. 查找出耗用cpu最高的进程
```java
// 展示所有进程占用情况
top
// 展示CPU占用最高的5个进程
top -N 5
```
2. 查找出占用cpu最高的线程id
```java
top -H -p PID
```
3. 获取对应线程的线程栈信息
```java
// 将线程ID转换为16进制
printf "%x\n" tid
// 获取对应线程的线程栈信息
jstack 进程号 | grep 线程ID
// 将今后所有堆栈信息都打印到stack.txt中
jstack 进程号 >> stack.txt
```