先说一下背景
做的是一款网络设备监控的软件,通过定时任务不停巡检各个设备,像交换机,防火墙等,
为了效率一个设备启动一个线程,通过设备管理端口登录交换机执行命令,项目上线后过了几天客户说巡检数据无变化,但是其它功能正常。
首先我想到的是用jconsole连接程序:如下图

一看线程数肯定不正常,然后通过线程统计脚本统计哪类线程最多,

通过jconsole选中pool开头的线程看堆信息,如下图:
标红的是业务代码:

大概知道代码是那块的问题,这是同事写的代码,但是同事不知道该哪里,代码给大模型分析也给不出具体的位置。
这时候arthas上场,
启动arthas
在项目运行服务器执行如下命令
curl -O https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar
选择运行项目进程
执行下面命令
thread -i 100 # 采样间隔100毫秒,查看线程运行时长、CPU
随便找了个pool开头的线程ID(68906)
再执行命令:
heapdump --live /tmp/thread-heap.hprof
然后把thread-heap.hprof下载到自己电脑上
通过mat分析

到这里就知道如何复现场景了,问题就定位到了。
软件行业口头禅,找到问题基本就解决问题了。