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
从top命令中我们查看到5526这个线程的pid占用CPU高。
(2)然后将这个时刻的所有线程写入到日志文件中去
# /jdk/bin/jstack 1 > 1.log
(3)在日志文件中查看刚才占用CPU高的pid的线程堆栈信息
# printf "%0x" 5526
获取到5526这个pid其16进制值是0x1596,然后可以在日志文件中查找对应的线程堆栈信息
这个线程堆栈信息里面还有对应的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都能监控得到,...
点击下载文档
本文2024-09-23 01:14:52发表“云苍穹知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-cangqiong-144729.html
您需要登录后才可以发表评论, 登录登录 或者 注册
最新文档
热门文章