jdk追踪线程堆栈方法

栏目:云苍穹知识作者:金蝶来源:金蝶云社区发布:2024-09-23浏览:2

jdk追踪线程堆栈方法

1 背景

我们经常遇到某个java进程占用CPU非常高,但又不知道他正在做什么,被什么线程给阻塞了。当然这些信息苍穹的monitor都能监控得到,非常简单就能定位到问题。但苍穹的monitor通常是通过nginx转发到web节点,再由web节点远程调用访问到其他微服务节点的monitor去的,当微服务节点近乎hang住时,monitor的web界面就刷不出信息来了。这时我们可以直接到容器中手动跟踪线程堆栈来定位问题。

2 操作步骤

(1)、top -H -p pid 先查看哪个PID的线程资源持续占用高;
(2)、通过jstack pid 导出线程信息;
(3)、printf "%0x" 线程pid 获得其16进制的值,然后查看16进制所在的线程堆栈信息。

3 分析案例

(1)top命令查看获取占用高的线程号(-p 1 表示容器中1号进程,即java主进程)

# top -H -p 1 


image.webp


从top命令中我们查看到5526这个线程的pid占用CPU高。


(2)然后将这个时刻的所有线程写入到日志文件中去
# /jdk/bin/jstack 1 > 1.log


(3)在日志文件中查看刚才占用CPU高的pid的线程堆栈信息

# printf "%0x" 5526


image.webp


获取到5526这个pid其16进制值是0x1596,然后可以在日志文件中查找对应的线程堆栈信息


image.webp


这个线程堆栈信息里面还有对应的traceId,可以继续从monitor里面分析整个调用信息。


最后,由于上述方法分三步查询起来会比较费时间,有些执行时间短但是执行次数多的情况就不太适合了,可能刚top看到想要生成日志时就已经处理完了。这时生成出来的日志就看不到信息。所以可以通过下面这条语句进行持续观察:

# top -H -p 1 -n 5 -b | grep "top -" -A 16 > ss1.log  && /jdk/bin/jstack -l  1 >> ss1.log

上述命令是:从top中查询5次,然后查看5次是否都是同一个pid占用cpu高,然后根据查到的pid信息转换成16进制后再搜索线程堆栈。


jdk追踪线程堆栈方法

1 背景我们经常遇到某个java进程占用CPU非常高,但又不知道他正在做什么,被什么线程给阻塞了。当然这些信息苍穹的monitor都能监控得到,...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息