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 ```