cpu经常性会跑到90%多甚至是跑满,已排查完问题,进行下场景模拟。
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
/**
* @author company
*/
public class JstackDemo {
private static int number = 0;
private static Executor executor = Executors.newFixedThreadPool(10);
public static void main(String[] args) {
executor.execute(() -> {
// 死循环
while (true) {
number++;
}
});
executor.execute(() -> {
System.out.println("run");
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
});
}
}
接下来我们在服务器进行运行。
[root@linux-04 jstack]# javac JstackDemo.java
[root@linux-04 jstack]# java JstackDemo &
[root@linux-04 jstack]# top
我们看到pid 为11063的cpu已经占用到99.7了,接下来查看下是不是我们刚运行的服务。
[root@linux-04 jstack]# jps -l
没错就是他!
[root@linux-04 jstack]# top -Hp 11063 #获取当前进程下线程占用cpu的排序情况
我们可以看到11073是占用最高线程,接下来我们查下这条线程的运行状态
[root@linux-04 jstack]# printf "%x" 11073
2b41
[root@linux-04 jstack]# printf "%x" 11073
root@linux-04 jstack]# jstack 11063 |grep 2b41
"pool-1-thread-1" #8 prio=5 os_prio=0 tid=0x00007f24e00f8800 nid=0x2b41 runnable [0x00007f24bd9d4000]
[root@linux-04 jstack]# jstack 11063 > temp
[root@linux-04 jstack]# vim temp
stack命令生成的thread dump信息包含了JVM中所有存活的线程,线程号为16进制数字,我们需要先转换成16进制,然后再查找nid=0x2b41的线程运行情况。
我们看到已经打印出来当前线程的运行情况,我们就能直接获取到出问题的代码存在哪,好了收工。