多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# 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()。