2

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

有时应用程序会停止,并且似乎出现死锁情况,许多线程处于 BLOCKED 状态,如最后粘贴的 Thread Dump 的这段代码片段所示。

问题
1. 什么是 Transaction Reaper Worker - 它锁定了哪些资源?
2. 这是 JTA 问题吗?是什么造成的。我该如何调查,进一步解决这个问题?
3. 几乎有 10 个线程处于 BLOCKED 状态,具有类似的堆栈跟踪。这个问题可能是由 db 端出现问题引起的吗

非常感谢任何帮助。

"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)     
4

2 回答 2

1

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

要回答您的问题:

  1. Transaction Reaper Worker 是一个线程,其工作大概是确保在程序员错误(例如未正确关闭事务)或未处理的网络错误的情况下未提交的事务对象不会累积
  2. 这是 JBoss JTA 库中的一个错误(或者您可能使用错误,但它看起来更像是一个错误)。你应该跟进JBoss团队,最好有一些条件来重现
  3. 这可能是由于未经测试的错误条件组合造成的,可能与网络层或您推测的数据库有关
于 2013-06-16T21:53:39.510 回答
0

这当然有可能是 JBoss Transactions 中的一个错误。值得调查这是否是您自己代码中的错误。该线程ajp-0.0.0.0-8809-19是 servlet 容器的工作线程之一,它执行您的代码。有问题的行为是它获得了收割者后来想要的锁:

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

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

于 2013-06-16T22:05:09.357 回答