乐趣区

关于java:线上CPU飙升问题查找总结

线上 CPU 飙升问题查找总结

相干命令

  1. 查看 cpu 占用最大的过程:top -c
  2. 查看过程下线程的 cpu: top -Hp {过程号 (PID)}
  3. 获取线程号: printf "%x\n" {线程的 PID}

    如果输入 db1, 则线程号为 0xdb1

  4. 获取线程的状态和信息: jstack {过程号} | grep {线程号 ( 例如 0xdb1)}
  5. 查看线程异样信息: jstack -l {线程 PID}, 也能够保留到文件中查看: jstack -l {线程 PID} > {文件名}.stack
  6. 获取过程持续时间的 GC 状况: jstat -gcutil {过程号 PID} {统计距离 ( 毫秒)} {统计次数}

    jmap -heap {过程 PID} 查看过程堆内是否要溢出了

  7. 导出过程的 dump 文件

    jmap -dump:format=b,file={文件名}.dmp {过程 PID} 体积和堆一样大,速度慢
    jmap -dump:live,format=b,file={文件名}.hprof {过程 PID},堆内存活的 dump 文件,体积小于堆,hprof 能够给 MAT 剖析用(举荐)

  8. Linux 查看 Java 过程的启动参数 (次要用来查看堆空间调配,和 GC 计划的采纳)

    • ps eww {过程 PID}
    • jcmd {过程 PID} VM.flags
    • jinfo -flags {过程 PID}
    • jmap -heap {过程 PID}

起因

  1. 内存耗费过大, 导致 Full GC 过多
  2. 代码中有大量耗费 CPU 的操作,导致 CPU 过高,零碎运行迟缓
  3. 因为锁使用不当,导致死锁
  4. 随机呈现大量线程拜访接口,导致迟缓
  5. 某个线程因为某种原因始终在 WAITING 状态,导致此时该性能不可用

方向

  1. 查看监控平台,看 http 申请和 feign 申请是否异样
  2. 查看满接口平台,查看工夫较长的申请接口
  3. 查看数据库拜访,找到查问数据量较大的 sql 或慢 sql
  4. 查看 JVM 监控,查看堆内存的异样或 GC 异常情况
  5. 查看线程是否有异常情况
退出移动版