# Jstack
**简介:**
jstack是jdk自带的命令,常用来打印Java进程/core文件/远程调试端口的Java线程堆栈跟踪信息,包含当前虚拟机中所有线程正在执行的方法堆栈信息的集合。
**语法:**
jstack [ options ] pid //Java进程
jstack [ options ] executable core //core文件
jstack [ options ] [ server-id@ ] remote-hostname-or-IP //远程调试端口
**选项:**
![](https://box.kancloud.cn/f26c153fc2b248845f1937009f1f183e_383x131.png)
**示例:**
![](https://box.kancloud.cn/1db09a4d6032d82ce08c5541b7fd8214_755x242.jpg)
# 应用
jstack可以定位到线程堆栈,根据堆栈信息我们可以定位到具体代码,所以它在JVM性能调优中使用得非常多。下面我们来一个实例找出某个Java进程中最耗费CPU的Java线程并定位堆栈信息,用到的命令有jps、top、printf、jstack、grep。
**第一步先找出Java进程ID,若服务器上的Java应用名称为Main:**
jps | grep $Main | awk '{print $1}'
42572
得到进程ID为42572,
**第二步找出该进程内最耗费CPU的线程,可以使用:**
top -Hp pid
输出如下:
![](https://box.kancloud.cn/cc7d60a3ba05df23a5e12ab939bf2986_643x521.png)
TIME列就是各个Java线程耗费的CPU时间,CPU时间最长的是线程ID为42606的线程,用
printf "%x\n" 42606
a66e
得到42606的十六进制值为a66e,下面会用到。
OK,下一步终于轮到jstack上场了,它用来输出进程42572的堆栈信息,然后根据线程ID的十六进制值grep,如下:
root@ubuntu:/# jstack 42572| grep a66e
"PollIntervalRetrySchedulerThread" prio=10 tid=0x00007f950043e000 nid=0x54ee in Object.wait()
可以看到CPU消耗在PollIntervalRetrySchedulerThread这个类的Object.wait()。