2012-07-05 18 views
9

Mam opartą na Java EE aplikację działającą na tomcat i widzę, że nagle aplikacja zawiesza się po uruchomieniu przez kilka godzin.Analizowanie zrzutów wątku procesu java

Zebrałem zrzutu wątku z aplikacji tuż przed wisi i umieścić go w TDA do analizy:

enter image description here

TDA (gwint Dump Analyzer) daje następujący komunikat o powyższym monitora:

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. 

A oto StackTrace gwintu podkreślono powyżej:

"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) 

Chcę wiedzieć, co oznacza stan "waiting for monitor entry"? A także docenią wszelkie wskazówki, które pomogą mi rozwiązać ten problem.

+4

I będzie wyszukiwał w pamięci podręcznej właściwości systemu, zamiast wywoływać je wielokrotnie w ten sposób. Nie powinieneś wywoływać System.getProperty() więcej niż kilkanaście razy w ciągu całego życia aplikacji. tj. powinieneś go zakodować, aby nie był to szyjka butelki. –

+0

hmm .. dobry punkt Peter! – peakit

Odpowiedz

1

Monitor = zsynchronizowany. Masz wiele wątków próbujących uzyskać blokadę tego samego obiektu.

Może należy przełączyć się z hashtable i użyć HashMap

+0

Jeśli widzisz, nie używam bezpośrednio 'Hashtable'. Przychodzi z mojego wywołania do 'System.getProperty()'. Czy istnieje nieblokująca wersja 'System.getProperty()'? Dzięki! – peakit

1

Oznacza to, że wątek próbuje ustawić blokadę (na Hashtable), ale jakiś inny wątek jest już dostępu do niego i ustawił blokadę . Więc czeka na zwolnienie blokady. Sprawdź, co robią inne wątki. W szczególności wątek z tid = "0x00007f9819560000"

+0

Co ciekawe, NIE widzę żadnego wątku z 'tid = 0x00007f9819560000' w pliku zrzutu wątku. Dowolny pomysł? – peakit

+0

Mmmmh, prawdopodobnie jest wtedy blokada stołu monitora VM. Niedostrzeganie kodu, będzie trudne. Zasadniczo Hashtable rywalizują między dwoma wątkami. Jedną opcją może być zamiana HashTable na HashMap (ponieważ HashMap nie jest bezpieczna dla wątków). Wiem, że korzystasz z usługi Property, ale po prostu skopiuj ją do mapy i później użyj mapy. Więc zobaczysz, że wysadza w powietrze rywalizację (prawdopodobnie ConcurrentModificationException), lub zaczyna działać, ponieważ blokada nie była nawet potrzebna. – mprivat

5

Jeden z twoich wątków uzyskał obiekt monitora (wyłączna blokada obiektu). Oznacza to, że wątek wykonuje zsynchronizowany kod i z jakiegokolwiek powodu utknął tam, prawdopodobnie czekając na inne wątki. Ale inne wątki nie mogą kontynuować wykonywania, ponieważ napotkały zsynchronizowany blok i poprosiły o blokadę (obiekt monitora), jednak nie mogą go pobrać, dopóki nie zostanie zwolniony przez inny wątek. A więc ... prawdopodobnie impas.

2

Proszę spojrzeć na ten ciąg z całego wątku zrzucić

- zablokowana < 0x00007f9819560000>

Jeśli można go znaleźć, nitka jest impas z gwintem "tid = 0x00007f97f1918800"

+0

yes bobon, szukałem w całym zrzucie wątku dla tego ciągu i nie mogłem znaleźć żadnego innego odniesienia dla tego id oprócz wątku podświetlonego w pytaniu. – peakit

Powiązane problemy