维护服务器时,会出现java进程在CPU、内存、硬盘上总是出现异常情况。
如何找到是哪些代码出现这些异常呢?
本文使用jstack来实现这个需求
方法/步骤
-
先写一段代码来模拟一个耗CPU的线程
代码:
package chapter1;
public class FindJavaThreadInTaskManager {
public static void main(String[] args) {
Thread thread = new Thread(new Worker());
thread.start();
}
static class Worker implements Runnable {
@Override
public void run() {
while (true) {
System.out.println("Thread Name:" + Thread.currentThread().getName());
}
}
}
}
-
执行上述代码,
模拟一个CPU和IO利用率都高线程
-
打开任务管理,
此例中,CPU利用率比较高java进程ID为7064
-
使用ProcessExplorer找到ID号为7064的进程
-
使用ProcessExplorer查看进程ID为7064的属性信息
在Thread标签找到CPU利用率的线程信息,TID为6120(10进制)
-
将CPU利用率高的线程ID 6120(10进制)
转换为0x17E8(16进制)
-
使用jstack查看进程7064的线程信息。
找到线程号为0x17E8的线程
命令:
jstack -l 7064
-
查看第13行的代码信息,与实际情况相符。
至此,找到引发CPU利用率高的代码