1、找到java进程ID
运行命令# ps -ef|grep java | grep -v grep
运行命令后可得到进程ID为:3407
2、找到此进程中消耗CPU较高的线程ID
运行命令# 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-***"开头的堆栈信息,此信息表示程序正常处理的线程,则表示程序本身有待优化
打印出的情况还有很多种,后面发现了再更新此文章,欢迎大神提供你们遇到的情况,大家互相学习。