我在一个代理类中发现了这个问题,该代理类将另一个类包装在自定义锁定机制中。
我继续创建一系列线程转储。由于我使用JVisualVM进行分析,因此在此过程中我创建了一些线程转储。 也工作了,就像Syneso在他的答案中提到的一样。Ctrl+Break
kill -3 <pid>
我使用注释中提到的线程转储分析器来分析它们。我不知道首先要寻找什么,但是由于TDA中对象和监视器的链接,我发现了这样的东西:
"pool-9-thread-32" #304 prio=5 os_prio=0 tid=0x000000002a706800 nid=0x348c waiting for monitor entry [0x000000003f06e000]
java.lang.Thread.State: BLOCKED (on object monitor)
at com.example.MyClass.method1(MyClass.java:400)
- waiting to lock <0x0000000680837b90> (a com.example.DifferentClass)
at com.example.MyClass.query(MyClass.java:500)
... omitted ...
at java.util.concurrent.FutureTask.run(FutureTask.java:270)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:618)
at java.lang.Thread.run(Thread.java:745)
Locked ownable synchronizers:
- <0x000000075bc59aa8> (a java.util.concurrent.ThreadPoolExecutor$Worker)
DifferentClass
扩展抽象,并且有一个从 到 的调用,其中 DTO 对象被传递给一个方法,该方法执行大量处理,日志记录并最终保存到数据库。代理类是在创建其中一个数据库处理类期间使用的。MyClass
method1()
DifferentClass