2010-11-13 8 views
6

Zwykle, gdy pytam o zrzut wątku, objawy słabo działającego systemu są łatwe do wyjaśnienia; tj. normalnie byłbym w stanie zobaczyć, że pewna liczba wątków wyraźnie czeka na monitorze, który został zdobyty, ale nie został zwolniony przez inny.Nici Java czekają na zablokowanie obiektu, który nie jest (widocznie) zablokowany.

W tym przypadku mam dużo wątków oczekujących na monitor (0x965ad100), ale żaden nie wydaje się mieć tego monitora w pierwszej kolejności. Gwinty o których mowa, mogą być identyfikowane z tym podpisem:

czeka, aby zablokować < 0x965ad100> (a uk.gov.dti.og.fox.ConAgent)

Próbowałem Googling to, i wszystko, co wydaje mi się znajdować, to posty, które omawiają monitory, które są zablokowane, nic o czekaniu na monitor, który nie jest zablokowany.

zrzutu wątku w całości: http://www.basson.at/docs/stackoverflow/thread_dump.txt

Mam nadzieję, że ktoś tutaj może wyjaśnić, co widzę, albo przynajmniej pkt mnie we właściwym kierunku. Z góry dziękuję za wszelkie odpowiedzi.

+0

BTW, lepiej sprawdzić, co jest wątek-9 robi, bo czeka na ten sam zamek to już nabytej (0x96560c48) –

Odpowiedz

1

Możliwe jest (choć mało prawdopodobne), że wątek właśnie zwolnił monitor po zrobieniu zrzutu wątku. Pomiędzy zwolnieniem monitora a następnym wątkiem może wystąpić krótki okres. Jeśli nie jesteś w realnym impasie, może to wyjaśnić, co widzisz. Wypróbuj inny zrzut wątku i sprawdź ten.

Najprawdopodobniej jest tam nić gdzieś, która już trzyma monitor. Czasami nie jest to oczywiste. Twoje ślady stosu mają pewne "zablokowane" linie, które wyświetlają listy wątków, które posiadają pewne blokady, ale lista ta niekoniecznie jest kompletna. Na przykład podejrzewam, że blokady uzyskane przez JNI nie są wymienione.

Jeśli można wymienić wbudowaną blokadę na, np. java.util.concurrent.locks.ReentrantLock, możesz zawiesić program i załączyć debugger, znaleźć blokadę i znaleźć właściciela blokady, używając metody getOwner.

1

Jeśli używasz platformy Eclipse, możesz użyć wbudowanej przeglądarki blokad w widoku Debug, co może być pomocne. Można włączyć go za pomocą menu rozwijanego dojechać strzałki w dół na pasku :)

alt text