分析java进程的线程转储

时间:2012-07-05 14:48:25

标签: java java-ee-6 thread-dump

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

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

enter image description here

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 个答案:

答案 0 :(得分:5)

您的一个线程获得了一个监视器对象(对象的独占锁)。这意味着线程正在执行同步代码,无论出于何种原因,可能正在等待其他线程。但是其他线程无法继续执行,因为它们遇到了一个synchronized块并要求一个锁(监视器对象),但是在它被其他线程释放之前它们无法获取。所以...可能是僵局。

答案 1 :(得分:2)

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

- 已锁定&lt; 0x00007f9819560000&gt;

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

答案 2 :(得分:1)

Monitor = synchronized。你有很多线程试图锁定同一个对象。

也许您应该从使用Hashtable切换并使用HashMap

答案 3 :(得分:1)

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

的线程