先执行一个java程序里面开了两个线程分别都在while循环作打印操做。 java
# java -cp ./test-threads.jar com.spiro.Main
经过top命令查看当前CPU状况
shell
能够看到有个java进程占用CPU太高,下面来排查是什么线程的什么代码致使CPU太高。 windows
先得到PID为2023,上图能够看到,或者经过jps命令获取。 执行如下命令: 性能
# top -H -p2023
说明: -H 指显示线程,-p 是指定进程spa
结果:线程
能够看到两个CPU占用较高的线程,记下PID 2033和2034 ( 此处的PID即为线程ID标识) ,将其从十进制转成十六进制表示,可经过windows自带的计算器来转。获得结果分别为7f1和7f2
code
再经过jstack命令获取当前线程栈,可暂时保存到一个文件tempfile.txt中; 进程
# jstack -l 2023 > tempfile.txt
在tempfile.txt中查找nid=0x7f1的线程: class
能够看到咱们找到的线程Thread-0,以及该线程的状态和正在执行的代码行,本例中显示当前正在执行Worker类的15行。而后可去代码中查看不合理的逻辑
thread
该方法颇有用,屡次使用该方法定位出程序中的性能问题,在此分享和记录。