jstack 可以定位到线程堆栈,根据堆栈信息我们可以确定到具体代码,所以JVM性能调优中用的非常多。下面我们将通过一个实例来找出java进程中最耗费CUP的线程,并定位堆栈信息。
1.将下面的代码打成可执行jar包
/**
*
* 这个方法为了验证jstack 作用
*
*/
public class FindJavaThreadInTaskManager {
public static void main(String[] args) {
FindJavaThreadInTaskManager.method1();
FindJavaThreadInTaskManager.method2();
}
/**
*
* 模拟多线程中cup低的方法
*
*/
public static void method1() {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
while (true) {
System.out.println("当前线程名字为: " + Thread.currentThread().getName());
}
}
});
thread.setName("线程1");
thread.start();
}
/**
*
* 模拟多线程中cup低的方法
*
*/
public static void method2() {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
while (true) {
System.out.println("当前线程名字为: " + Thread.currentThread().getName());
try {
Thread.currentThread().sleep(50L);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
thread.setName("线程2");
thread.start();
}
}
2.在Linux上执行 该jar包
3.找到CPU利用率持续比较高的进程,获取进程号,此处PID为2419
4.找到上述进程中,CPU利用率比较高的线程号TID(十进制数),此处为3046
命令:
ps p 2419 -L -o pcpu,pid,tid,time,tname,cmd
//ps -Lfp 2419 也可以,不过要看TIME列
5.将获取的线程号(十进制数)转换成十六进制,此处为97c
printf "%x\n" 2428
6.查看进程PID为2419中nid为0xb46的线程信息。
jstack 2419 |grep 97c
注:根据上面的信息可以确定具体哪个线程占用的CUP最多
另外也可以通过如下方法确认:
jstack -l 2419 | more
//上面‘-l’ 为‘-小写L’
备注:来源请参照 https://jingyan.baidu.com/album/4f34706e3ec075e387b56df2.html?picindex=6