一、问题
多批次导入任务,会出现异步线程停止工作的情况,后续无论导入多少任务,异步线程都不会执行,只有重启能解决。
二、工具使用
进入jdk的bin目录:
cd /beeb/ap/uip/jdk1.8.0_231/bin
2.1 拉取jstack日志:
./jstack -l 28406 >./sp-dbms.jstack.log
其中28406是服务进程号。
2.2 通过jmap分析:
./jmap -dump:live,format=b,file=/beeb/ap/uip/agent/udp-logs/sp-dbms/appLogs/sp-dbms-heap.bin 28406
2.2.1 使用jhat工具:
1.启动jhat:
jhat xxx.dump
实战图:
jhat命令后面跟的是文件名,这个文件名的后缀可以是.dump,也可以是.bin,具体要看你到出的文件后缀。
2.启动后,就可以访问:http://127.0.0.1:7000/
通过分析堆内存没看出有什么异常,于是我掉头又去查看了sp-dbms.jstack.log日志。
三、分析jstack日志
3.1 查看jstack日志
可以看的下图中,对应的线程信息,async-import-16(就是我用到的线程池)线程属于WAITING状态,并且parking to wait for (CountDownLatch),那么我可以猜测,是不是因为CountDownLatch这个共享锁因为某些原因没有释放出来?
3.2 查看代码
查看代码,捕获异常后更新数据,插入失败状态以及失败原因,这里有可能出现数据库连接等异常,导致下面的latch.countDown()未执行,继而出现线程一直在等待的问题:
3.3 解决方法
在第一个红框出的update...方法处try...catch一下就行了。
四、java visualVM使用步骤
解决这个问题没有用到java visualVM工具,但我也记录一下它的使用步骤:
4.1 找到jdk的bin路径
打开jvisualvm.exe。
4.2 加载我们之前jmap拉下来的xx-heap.dump或xx-heap.bin文件
4.3 接下来就可以分析了
具体分析方法以后再阐述。