天天看点

如何排查CPU占用太高

 线上项目运行时,出现问题不像在本地那么容易排查,经常需要借助日志、或者一些工具来找出问题。cpu被占满我们经常会遇到。比如我们有这样一段代码:

1 public Class Demo1_16 {
 2 
 3     public static void main(String[] args) {
 4 
 5         new Thread(null, () -> {
 6         System.out.println("...");
 7         while(true) {
 8             
 9         }
10      }, "thread1").start;
11    }
12 }      

具体排查方法就是:

  • top 命令定位进程,比如图中32655进程占用了97.7%
如何排查CPU占用太高
  • 接着可以用 "ps H -eo pid, tid, %cpu | grep 进程id" 命令定位具体线程
如何排查CPU占用太高
  • 最后用jvm命令  "jstack 进程id" ,根据线程id找到有问题的线程(10进制转换为16进制),具体到源代码行数。"thread3"这样开头的是我们自己写的程序,其他样式的是虚拟机线程,名称是固定的。
如何排查CPU占用太高

接着要将进程id转换为16进制,比如 32655 --> 0x7f99,也就是 “thread1”,具体到第8行代码有问题, 就是while死循环的问题。