2012-07-05 106 views
9

我有基于Java EE的应用程序在tomcat上运行,我看到突然间应用程序在运行几个小时后挂起。分析java进程的线程转储

我收集了它挂起之前应用程序的线程转储,并把它放在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

我死锁会缓存查找系统属性,而不是像这样重复地调用它们。在应用程序的整个生命周期中,您不需要调用System.getProperty()超过十几次。即你应该编码它,因为它不是瓶颈。 – 2012-07-05 16:06:31

+0

嗯..好点的彼得! – peakit 2012-07-05 16:13:47

回答

1

Monitor = synchronized。你有很多线程试图获得同一个对象上的锁。

也许你应该使用Hashtable的切换,并使用HashMap

+0

如果你看到我没有直接使用'Hashtable'。它来自我对'System.getProperty()'的调用。有没有一个非阻塞版本的'System.getProperty()'?谢谢! – peakit 2012-07-05 14:54:17

1

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

+0

有趣的是,在线程转储文件中,我看不到有'tid = 0x00007f9819560000'的任何线程。任何想法? – peakit 2012-07-05 15:03:45

+0

嗯,可能是虚拟机监视器表锁然后。没有看到代码,这将是艰难的。实质上,Hashtable正在两个线程之间竞争。一种选择可能是用HashMap替换Hashtable(因为HashMap不是线程安全的)。我知道你正在使用Property,但只是复制到地图中,然后使用地图。所以你会看到它在争用上爆发了(ConcurrentModificationException可能),或者它开始工作,因为甚至不需要该锁。 – mprivat 2012-07-05 16:17:48

5

其中一个线程获取监视器对象(对象的排他锁)。这意味着线程正在执行同步代码,并且出于任何原因卡在那里,可能正在等待其他线程。但是其他线程无法继续执行,因为它们遇到同步块并要求锁定(监视对象),但是直到它被其他线程释放后才能得到它。所以......可能会陷入僵局。

2

请认准从整个主题此字符串转储

- 锁定< 0x00007f9819560000>

如果你能找到它,线程是用丝线 “TID = 0x00007f97f1918800”

+0

是bobon,我在整个线程转储中搜索了这个字符串,除了问题中突出显示的线程之外,找不到其他任何此id的引用。 – peakit 2012-07-05 15:33:32