2012-07-10 16 views
8

Mam następujący problem:
Wdrażam aplikację internetową w Tomcat (Linux) i po zamknięciu Tomcat, jeśli robię ps -ef nadal widzę uruchomiony proces java.
Wierzę, że dzieje się tak z powodu zwisającego wątku, ale nie wiem, jak mogę to śledzić.
Jak mogę debugować ten problem?Jak mogę debugować zwisający wątek java?

Odpowiedz

5

Można generować 4-5 zrzuty wątków zgodnie z poniższym opisem, a następnie analizować je przy użyciu narzędzi takich jak Samurai.

To, co chcesz sprawdzić, to kiedy utkniesz w wątku lub długa uruchomiona transakcja, wszystkie zrzuty wątku pokaże pewien identyfikator wątku na tym samym wierszu w twoim stosie java. Mówiąc prościej, transakcja obejmuje wiele zrzutów wątków i dlatego wymaga więcej badań.

Teraz po uruchomieniu ich przez Samurai podświetli się je kolorem czerwonym, aby można było szybko kliknąć i wyświetlić wiersze z problemami.

Zobacz przykład tego here. Spójrz na obraz wyjściowy Samurai w tym łączu. Zielone komórki są w porządku. Czerwone i szare komórki wymagają patrzenia.

Generowanie wysypisko wątku:

(Linux)

Jeśli JVM działa w konsoli następnie wystarczy nacisnąć Ctrl-\. Jeśli JVM jest uruchomiony w tle, a następnie wysłać go Quit sygnał:

kill -QUIT process_id

Nie

PROCESS_ID jest numerem procesu uruchomionego procesu Java. Zrzut wątku zostanie wysłany tam, gdzie przekierowane jest standardowe wyjście. można zazwyczaj uzyskać numery procesowych wszystkich uruchomionych procesów Java za pomocą polecenia:

ps axf | grep java

+0

Jego nie że Jim prosi On prosi o debugowanie approch –

+0

@ user1348753, patrz edycja: – aviad

+0

@aviad: Zrobiłem 'kill -3' i wczytałem javacore do Samuraja. Nie było żadnej wizualnej tabeli po prostu log repor t.Jak mogę śledzić wątek z tego raportu? – Jim

2

Mówisz Twój proces java nadal istnieje, prawda? Procesy istnieją tak długo, jak długo mają załączone wątki, prawda? Jeśli tak, chciałbym przejść do następnego podejścia: - uruchomić proces z serwera MBean załączonym i zarządzane wewnętrznie przez JVM

Następnie podłącz do procesu po wysłaniu sygnału zamknąć i uzyskać zrzut wątek (tam powinny być JMX za to. Zobacz, które wyglądają podejrzanie nici do ciebie.

myślę, że można także użyć JVisualVM podjąć wątek wysypisk ...

+0

Nie wiem, jak zrobić to, co polecasz – Jim

+0

To wygląda jeszcze łatwiej, ale było już sugerowane przez aviad :): http://www.crazysquirrel.com/computing/java/basics/java-thread-dump.jspx –

+0

Jeśli chodzi o podejście JVisualVM - oto tutorial http://docs.oracle.com /javase/6/docs/technotes/guides/visualvm/threads.html. Zasadniczo jvisualvm to po prostu plik wykonywalny, który można znaleźć w folderze $ JAVA_HOME/bin ... uruchom go, połącz się z aplikacją i zobacz, co możesz z nią zrobić. Całkiem potężne rzeczy, naprawdę :) –