第二步:先排查 java 任务线程本身,确定什么线程 cpu 占用过高
(1)方法一:ps -mp [java 进程 id] -o THREAD,tid,time | sort -n 找到 cpu 占用最大的线程 id
注意,该方法在生产环境测试,发现无法找到 cpu 占用高的线程,显示所有线程 cpu 占用均为 0,因此实际排查采用方法二
(2)使用 top -H -p [java 进程 id],找到 cpu 占用较高的线程 id,如下图所示,左边红框标注的 PID 列为线程 id
第三步:计算 java 线程 id 的 16 进制值,因为后续用 jstack 看到的线程快照中,线程 id 为小写十六进制值
(1)可百度在线进制转换
(2)可使用 windows 自带的计算器,程序员模式,可转换十六进制
(3)Linux 可使用命令:printf “%x\n” [线程_id]
第四步:使用命令 jstack [java 进程 pid] | grep [线程 id 十六进制值] -A 30(-A 30 表示向下打印 30 行)
分析上图可知,线程在做正则匹配,查看完整堆栈可定位到具体代码位置,分析后,确定在做 url 的正则匹配。继续分析其他线程,发现基本都在做 url 正则匹配。