繁体   English   中英

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

[英]Deadlock - Threads Blocked in Java EE Web Application

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

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

问题
1.什么是交易收割工人-它锁定了哪些资源?
2.这是JTA问题吗? 是什么原因造成的。 我该如何调查,并进一步解决?
3.几乎有10个处于BLOCKED状态的线程具有相似的堆栈跟踪。 可能是由于数据库端出现问题导致此问题

任何帮助,不胜感激。

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

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

要回答您的问题:

  1. Transaction Reaper Worker是一个线程,其工作大概是为了确保在程序员错误(例如,未正确关闭事务)或未处理的网络错误的情况下,未提交的事务对象不会累积
  2. 这是JBoss JTA库中的一个错误(或者您使用的错误,但似乎更像是一个错误)。 您应该跟进JBoss团队,最好在某些条件下进行复制
  3. 可能是由于未经测试的错误条件组合所致,可能与您猜测的网络层或数据库有关

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM