13

我在 tomcat 上运行基于 Java EE 的应用程序,我发现应用程序在运行几个小时后突然挂起。

我在应用程序挂起之前从应用程序中收集了线程转储,并将其放入 TDA 进行分析:

在此处输入图像描述

TDA(线程转储分析器)为上述监视器提供以下消息:

A lot of threads are waiting for this monitor to become available again.
This might indicate a congestion. You also should analyze other locks 
blocked by threads waiting for this monitor as there might be much more 
threads waiting for it.

这是上面突出显示的线程的堆栈跟踪:

"MY_THREAD" prio=10 tid=0x00007f97f1918800 nid=0x776a 
             waiting for monitor entry [0x00007f9819560000]
   java.lang.Thread.State: BLOCKED (on object monitor)
    at java.util.Hashtable.get(Hashtable.java:356)
    - locked <0x0000000680038b68> (a java.util.Properties)
    at java.util.Properties.getProperty(Properties.java:951)
    at java.lang.System.getProperty(System.java:709)
    at com.MyClass.myMethod(MyClass.java:344)

我想知道"waiting for monitor entry"状态是什么意思?并且也将不胜感激任何指针来帮助我调试这个问题。

4

4 回答 4

6

您的一个线程获取了一个监视器对象(对象上的独占锁)。这意味着线程正在执行同步代码,并且由于某种原因卡在那里,可能正在等待其他线程。但是其他线程无法继续执行,因为它们遇到了一个同步块并请求了一个锁(监控对象),但是直到它被其他线程释放后他们才能获得它。所以......可能是僵局。

于 2012-07-05T14:57:38.940 回答
2

请从整个线程转储中查找此字符串

- 锁定 <0x00007f9819560000>

如果你能找到它,线程死锁与线程“tid=0x00007f97f1918800”

于 2012-07-05T15:27:55.410 回答
1

这意味着您的线程正在尝试设置锁(在哈希表上),但其他一些线程已经在访问它并设置了锁。所以它正在等待锁释放。检查您的其他线程在做什么。特别是 tid="0x00007f9819560000" 的线程

于 2012-07-05T14:55:05.290 回答
1

监视器 = 同步。你有很多线程试图获取同一个对象的锁。

也许你应该从使用 Hashtable 切换到使用 HashMap

于 2012-07-05T14:51:00.730 回答