java线上服务排查cpu飙升

278 阅读1分钟

cpu飙高产生的原因

  1. CAS 自旋没有控制自旋次数
  2. 程序中存在死循环或者无限递归:如果程序中存在死循环或者无限递归,会导致 CPU不断执行相同的操作,造成 CPU 飙高
  3. 大量的线程竞争和锁等待:如果程序中存在大量的线程竞争和锁等待,CPU 在不断切换线程和处理锁等待的过程中会消耗大量的时间和资源,导致 CPU 使用率升高
  4. 服务器被 DDOS 工具攻击
  5. 频繁的垃圾回收:如果程序中存在内存泄漏或者频繁创建大量的临时对象,垃圾回收器就需要频繁进行垃圾回收操作,从而占用较高的 CPU 资源
  6. 长时间阻塞的 I/O 操作:如果程序中存在长时间阻塞的 I/O 操作(如网络请求、数据库查询等),CPU 可能会在等待这些操作完成时处于空闲状态,但是仍然会产生较高的 CPU 使用率

cpu飙升排查步骤

  1. 查找出耗用cpu最高的进程

      // 展示所有进程占用情况
      top
      // 展示CPU占用最高的5个进程
      top -N 5
    
  2. 查找出占用cpu最高的线程id

      top -H -p PID
    
  3. 获取对应线程的线程栈信息

    // 将线程ID转换为16进制
    printf "%x\n" tid
    
    // 获取对应线程的线程栈信息
    jstack 进程号 | grep 线程ID
    
    // 将今后所有堆栈信息都打印到stack.txt中
    jstack 进程号 >> stack.txt