正文
用 jvisualvm 查看也可以,不再赘述,结果都是一样的。
好了,工具介绍到此为止,下面重点
看代码
。
main 线程持有 <0x00000000c07a33d8> 这个对象的锁,同时它还需要 <0x00000000ff295ca8> 对象的锁;而 timeoutChecker_1_1 线程正好相反,于是死锁了
。
main 线程很好理解,就是我们这个 Spring Boot 应用的主线程。但是timeoutChecker_1_1线程是哪儿来的呢?通过分析发现它来自 Seata。
对了,该项目中 Spring Boot 版本是 2.6.6,
Seata 版本是 1.4.2
。
找到 timeoutChecker 的出处了:
延迟 60 秒启动定时任务,每隔 10 秒执行一次,调用 io.seata.core.rpc.netty.NettyClientChannelManager#reconnect()。
记住这一行,首先调用 RegistryFactory.getInstance() 获取一个 RegistryService,然后调用 RegistryService 对象的 lookup() 方法。