JVM调优jstack找出最耗cpu的线程&定位问题代码
一、服务器环境
jdk1.8 有多个tomcat容器运行java程序
二、用到的命令
top、printf、jstack、grep
三、排查过程
-
用top查出哪个java进程最消耗cpu命令:top 如下图
这三个指标可以看出进程PID为87010的进程很消耗资源
-
根据进程87010查出哪个线程最消耗cpu命令:top -Hp 87010 如下图
通过上图三个指标可以看出线程90255比较消耗资源,TIME列就是各个Java线程耗费的CPU时间。
-
printf “%x\n” 90255 得到一个16进制的数值 1608f
4.jstack 87010|grep 1608f,它用来输出进程90255的堆栈信息,然后根据线程ID的十六进制值grep,如下:可以看出是线程池ThreadPoolExecutor的问题,ok问题定位到了。
我爱你
为了找你
我搬进了鸟的眼睛里
我注视着风的方向
却忘记了猎人的枪响