1、找到java进程ID

运行命令# ps -ef|grep java | grep -v grep

jstack 命令跟踪 java 应用的堆栈 并分析堆栈结果

运行命令后可得到进程ID为:3407

2、找到此进程中消耗CPU较高的线程ID

jstack 命令跟踪 java 应用的堆栈 并分析堆栈结果

运行命令# top Hp3407

在上图TIME+列,表示为消耗CPU时间。如图得出消耗时间较长的线程ID为:3451

3、将线程ID转换为16进制

运行命令# printf "%x\n" 3451

运行命令后可得到16进制为:d7b

4、使用jstack命令打印堆栈信息

运行命令# jstack 3407 | grep d7b

5、打印结果分析

打印出的结果有几种,以下列出我遇到过的tomcat程序的几种:

情况一:直接打印出代码类名,这种情况就很好定位是代码的问题,优化代码即可
情况二:"C2 CompilerThread*"开头的堆栈信息,此信息表示java编译的线程,说明java编译器编译过于频繁,tomcat程序则加上参数 -XX:CICompilerCount=4 此设置表示改变编译器线程为4线程并行处理
情况三:"catalina-exec-***"开头的堆栈信息,此信息表示程序正常处理的线程,则表示程序本身有待优化
打印出的情况还有很多种,后面发现了再更新此文章,欢迎大神提供你们遇到的情况,大家互相学习。
 

相关文章: