我在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"
州的含义是什么?并且也会感谢任何帮助我调试此问题的指示。
答案 0 :(得分:5)
您的一个线程获得了一个监视器对象(对象的独占锁)。这意味着线程正在执行同步代码,无论出于何种原因,可能正在等待其他线程。但是其他线程无法继续执行,因为它们遇到了一个synchronized块并要求一个锁(监视器对象),但是在它被其他线程释放之前它们无法获取。所以...可能是僵局。
答案 1 :(得分:2)
请从整个线程转储中查找此字符串
- 已锁定&lt; 0x00007f9819560000&gt;
如果你能找到它,线程是死锁的线程“tid = 0x00007f97f1918800”
答案 2 :(得分:1)
Monitor = synchronized。你有很多线程试图锁定同一个对象。
也许您应该从使用Hashtable切换并使用HashMap
答案 3 :(得分:1)
这意味着你的线程正在尝试设置一个锁(在Hashtable上),但是其他一些线程已经在访问它并设置了一个锁。所以它正在等待锁定释放。检查你的其他线程正在做什么。特别是tid =“0x00007f9819560000”
的线程