死锁 - Java EE Web应用程序中阻塞的线程

时间:2013-04-23 07:05:36

标签: java multithreading java-ee jboss deadlock

我有一个部署在JBoss 6x中的Java / Java EE Web应用程序。

有时应用程序停止运行,并且似乎存在死锁情况,许多线程处于BLOCKED状态,如最后粘贴的Thread Dump的片段中所示。

问题
1.什么是交易收割者工人 - 锁定了什么资源? 这是JTA问题吗?造成这种情况的原因。我如何调查,进一步解决这个问题? 3.有近10个线程处于BLOCKED状态,具有类似的堆栈跟踪。这个问题可能是由于db end出错了吗?

非常感谢任何帮助。

"ajp-0.0.0.0-8809-19" - Thread t@238
java.lang.Thread.State: BLOCKED
    at com.arjuna.ats.arjuna.coordinator.BasicAction.removeChildThread(BasicAction.java:650)
    - waiting to lock <7c0d6> (a com.arjuna.ats.internal.jta.transaction.arjunacore.AtomicAction) owned by "Transaction Reaper Worker 44" t@942
    at com.arjuna.ats.internal.arjuna.thread.ThreadActionData.purgeActions(ThreadActionData.java:248
    ....
    ....
    Locked ownable synchronizers:
    - locked <ed3045> (a java.util.concurrent.locks.ReentrantLock$FairSync)

"Transaction Reaper Worker 44" - Thread t@942
   java.lang.Thread.State: WAITING
    at sun.misc.Unsafe.park(Native Method)
    - waiting to lock <ed3045> (a java.util.concurrent.locks.ReentrantLock$FairSync) owned by "ajp-0.0.0.0-8809-19" t@238
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:158)
    .....
    at com.arjuna.ats.arjuna.coordinator.BasicAction.doAbort(BasicAction.java:2902)
    at com.arjuna.ats.arjuna.coordinator.BasicAction.doAbort(BasicAction.java:2881)
    at com.arjuna.ats.arjuna.coordinator.BasicAction.Abort(BasicAction.java:1602)
    - locked <7c0d6> (a com.arjuna.ats.internal.jta.transaction.arjunacore.AtomicAction)
    at com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator.cancel(TwoPhaseCoordinator.java:119)
    at com.arjuna.ats.arjuna.AtomicAction.cancel(AtomicAction.java:212)
    at com.arjuna.ats.arjuna.coordinator.TransactionReaper.doCancellations(TransactionReaper.java:367)
    at com.arjuna.ats.internal.arjuna.coordinator.ReaperWorkerThread.run(ReaperWorkerThread.java:79)     

2 个答案:

答案 0 :(得分:1)

这是一个典型的僵局。线程ajp-0.0.0.0-8809-19已获取对象引用ed3045的锁定,并且正在等待获取对象引用7c0d6的锁定;但线程Transaction Reaper Worker 44锁定了后者并等待获取前者。也不会放手让对方获得他们想要的锁定,所以这是一个僵局。

回答你的问题:

  1. Transaction Reaper Worker是一个线程,其作业可能是为了确保在程序员错误(例如,未正确关闭事务)或未处理的网络错误的情况下未提交未提交的事务对象
  2. 这是JBoss JTA库中的一个错误(或者你可能错误地使用它,但它看起来更像是一个错误)。您应该跟进JBoss团队,最好有一些条件来重现
  3. 可能是由于未经测试的错误情况组合,可能与网络层相关,或者是您猜测的数据库

答案 1 :(得分:0)

这肯定是JBoss Transactions中的一个错误。值得研究一下它是否是您自己代码中的错误。线程ajp-0.0.0.0-8809-19是servlet容器的工作线程之一,它执行您的代码。可疑的行动是它获得了收割机后来想要的锁:

Locked ownable synchronizers:
- locked <ed3045> (a java.util.concurrent.locks.ReentrantLock$FairSync)

你能识别堆栈中锁定该对象的点吗?你最近的代码是什么,它在做什么?