分析java进程的线程转储

pea*_*kit 10 java thread-dump java-ee-6

我在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.
Run Code Online (Sandbox Code Playgroud)

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

"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)
Run Code Online (Sandbox Code Playgroud)

我想知道"waiting for monitor entry"国家意味着什么?并且也会感谢任何帮助我调试此问题的指针.

mae*_*tr0 5

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


Con*_*Del 1

监控=同步。您有很多线程试图获取同一对象上的锁。

也许你应该从使用 Hashtable 转而使用 HashMap