线上项目运行时,出现问题不像在本地那么容易排查,经常需要借助日志、或者一些工具来找出问题。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%
- 接着可以用 "ps H -eo pid, tid, %cpu | grep 进程id" 命令定位具体线程
- 最后用jvm命令 "jstack 进程id" ,根据线程id找到有问题的线程(10进制转换为16进制),具体到源代码行数。"thread3"这样开头的是我们自己写的程序,其他样式的是虚拟机线程,名称是固定的。
接着要将进程id转换为16进制,比如 32655 --> 0x7f99,也就是 “thread1”,具体到第8行代码有问题, 就是while死循环的问题。