首先我们要知道JVM将java中的多线程映射到操作系统是轻量级进程。
那么我们直观的拿到pid是不能够感知该进程内部的线程情况。
所以接下来我会教你如何在windows系统下找到占用cpu内存最高的线程。
1. 准备一段问题代码并运行
public class StackTest {
public static void main(String[] args) {
circle();
}
/**
* 死循环代码块
*/
private static void circle(){
int i = 0;
while (true){
i++;
}
}
}
2. 通过资源监视器查看占用CPU较高的java进程pid
3. 根据找到的PID 10432,使用jdk包下的jstack工具导出线程堆栈信息到指定文件。当然使用jvisualvm工具更为方便。命令:jstack 10432 > D:/jstack.log。
4. 下载辅助工具ProcessExplorer。这个工具用来查看进程内的线程信息。启动ProcessExplorer。按照PID寻找进程。右键->properties。
5. 通过上面的工具我们知道线程id(tid)为2776的线程占用cpu较高,我们需要到刚才导出的堆栈文件中查看它在干什么,当然我们需要将这个10进制的线程id转换为16进制的。
6. 用记事本打开刚才导出的stack.log然后全局搜索AD8,找到具体代码块。