ABei A Java Engineer

排查:CPU 爆满情况

2019-04-16
ABei
 

有三个重要的命令需要注意:

  1. top
  2. ps
  3. jstack

这里我将用一个简单的测试类 CustomEndlessLoop 来制造 CPU 爆满的情况。

public class CustomEndlessLoop {
	public static void main(String[] args) {
		int i = 0;
		while(true) {
			i =+ 1;
		}
	}
}

运行测试代码:

1. top 命令

我们可以通过 top 命令查看现在系统 CPU 占用情况:

可以看到,此时 CPU 爆满确实是因为 Java 进程造成的。但是具体是 Java 中的那个线程造成的,还需要继续排查。

2. ps 命令

在上面 top 命令中,我们知道是 9057 这个进程中出现了问题。下面,我们要通过 ps 命令来排查是哪些线程造成的。

通过 ps -mp 9057 -o THREAD,tid,time 可以罗列出 9057 中,具体是那些线程造成的。

从上图,我们已经找到了具体的问题线程是 —— TID: 9058 的线程。

为了方便后面的 jstack 命令查找线程 TID 方便,我们这里将 9058 转成 16 进制。

3. jstack 命令

jstack 是 JDK 自带的命令,专门就是来查看 java 进程中的线程信息的。

可以通过 jstack 9057 | grep 2362,查看 90572362 线程的具体信息。

这个线程正在运行状态。通过 jstack 9057 可以查看具体信息。

可以看到,除了后台线程和 VM 线程在运行,就只有 main 线程在运行。正在运行的代码也是指向了 CustomEndlessLoop 类。

总结

排查思路如下:

  1. 通过 top 命令,查找出 Java 进程 PID。
  2. 通过 ps -mp [PID] -o THREAD,tid,time,查找出问题线程的 TID。
  3. 通过 jstack [TID] 命令,查找出具体问题 Java 类。

Similar Posts

Comments