线程分析工具IBM thread

线程分析工具IBM thread

【前言】:这里分享一个线程分析工具IBM thread的使用。同时记录分享当时使用此工具遇到的bug和大致解决思路。

一、下载安装

从官网下载:https://www.ibm.com/docs/en/cmofm/9.5.0?topic=dump-thread-monitor-analyzer
启动下载后的jar就可以打开程序:java -jar jcaXXX.jar (需要本地安装jdk)

二、获取thread dump文件

在程序运行的Linux机器上执行jstack命令获取文件。指令解释详见官网:https://docs.oracle.com/en/java/javase/11/tools/jstack.html#GUID-721096FC-237B-473C-A461-DBBBB79E4F6A
常用命令如下:

jstack [pid]
jstack -l $(ps -ef | grep [process_name] | grep 'java' | grep -v grep | awk '{print $2}') >> threaddump.log
jstack [pid] | grep [thread_id]

三、将导出的文件在ibm工具中打开

如下:点击具体选项进行分析
线程.png
记一次线上问题:有一次发版后隔天就遇到线程池拒绝的错误,那我只能认为线程池满了或者有某次或某几次任务执行时间特别长导致。在没有业务突然陡增的情况下,我当然会认为是后者,但是由于原先代码异常打印写的有问题,导致一直找不到日志也看不到线程堆栈,在现有日志上无法分析定位问题,也无法找到证据证明某些猜测。于是就是使用此工具分析线程,一开始发现没有死锁,没有锁等待,于是果断排除是分布式锁导致的线程未释放问题。到此基本断定是栈溢出的问题导致程序业务卡死,而且大概率还是业务代码问题导致。最后看了下最不可能有问题的runing(正在工作)线程,发现数量60正好是有问题的线程池最大线程数,于是点进去看线程堆栈详情,发现很多线程都卡在某个方法上,基本就断定到问题了。将堆栈信息发到群里后,熟悉这块的几个同事一起看代码逻辑后,发现定位到的方法(某个业务状态回滚)出现死循环,才导致线程一直未释放。怎么说呢?回滚代码出错且没有正确打印异常的日志还是比较不容易想到的,也是半推测半用工具定位出来的。

线程2.png

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值