2009-05-25 14 views
27

Próbuję uruchomić komendę jstack w mojej aplikacji java. Aplikacja jest dość duża, działa w jboss AS zajmując około 4GB pamięci. System operacyjny to Windows Server 2003 Standard Edition. Za każdym razem, gdy pojawia się błąd "Brak wystarczającej ilości pamięci do przetworzenia tego polecenia". Jest wystarczająco dużo pamięci RAM, 16 GB i miejsce na dysku. Jakieś pomysły?Jstack i Brak wystarczającej ilości pamięci do przetworzenia tego polecenia

+3

To wydaje się być komunikat o błędzie systemu Windows. –

+0

Mam go na Tomcat, który przyjmuje 280 MB. – ripper234

+0

Również patrzyłem na to pytanie - http://stackoverflow.com/questions/222108/getting-the-java-thread-id-and-stack-trace-of-run-away-java-thread To doesn ' t pomoc, ponieważ jconsole nie widzi aplikacji. – ripper234

Odpowiedz

43

wpadłem niedawno na Win2008r2 i pomyślałem, że dzielę rozwiązanie ponieważ zajęło to trochę czasu, aby dowiedzieć się. Rob's comment about psexec -s jest to, co dla mnie zrobiło.

Wygląda na to, że Vista i później jstack nie działają wbrew usługom ze względu na kontekst użytkownika. Nie ma nic wspólnego z pamięcią. Podejrzewam, że z tego samego powodu ludzie widzieli ten problem w 2003 roku za pomocą zdalnego pulpitu, chyba że użyjesz przełącznika/admin lub/console na mstsc. Począwszy od Visty, zaostrzone bezpieczeństwo prawdopodobnie je zepsuło.

Uruchamianie mojej aplikacji z okna cmd działało dobrze, ale to nie pomaga w debugowaniu naszej standardowej instalacji. Włączenie portu debugowania Java (dla VisualVM, Eclipse lub większości dowolnych debugerów Java) wymaga restartu aplikacji, więc tracisz stan, który prawdopodobnie próbujesz przechwycić, jeśli nie masz włączonego debugowania. Uruchomienie usługi pod moimi danymi logowania użytkownika nie zadziałało - byłem trochę zaskoczony. Ale psexec -s uruchamia jstack z kontekstu systemu, który działał jak czar. Aha, i będziesz musiał uruchomić psexec z podniesionego wiersza poleceń cmd, jeśli UAC jest włączony.

+0

To zadziałało właśnie dla mnie. –

+1

ditto. dzięki za uratowanie mojego dnia –

+0

Działa to świetnie z Win 2003. Bardzo dziękuję – dAm2K

3

Mieliśmy problemy z uruchomieniem JStack na komputerze z systemem Windows z nawet niewielką aplikacją (1 GB). Skończyliśmy robić naszą analizę stosu i sterty za pomocą Netbeans. To wydawało się radzić sobie z analizowaniem plików zrzutu o wiele lepiej. YMMV.

Daj Netbeanowi szansę na profilowanie - to bardzo dobrze. Zwróć uwagę, że VisualVM jest profilerem NB cięcia i jest dostarczany z 6u7.

7

W przeszłości Widziałem to, gdy JVM jest uruchomiony jako usługa systemu Windows w systemie Windows 2003.

Po pierwsze, sprawdź, czy jest to issue with the TMP directory.

Po drugie, jstack (lub inne narzędzia, takie jak jconsole) nie połączy się z procesem lokalnym, dopóki nie zostanie uruchomiony w tej samej sesji. Jeśli usługa działa jako określony użytkownik, możesz połączyć się, logując się do tej samej sesji. Jeśli korzystasz z Pulpitu zdalnego, możesz połączyć się za pomocą "mstsc/admin" (przyzwyczajenie do/console) i spróbować ponownie uruchomić program jstack. Zdecydowanie sprawdź, czy katalog TMP jest ustawiony prawidłowo, jeśli to nie rozwiąże problemu.

Jeśli usługa działa jako LocalSystem, powyższa procedura prawdopodobnie niewiele pomoże. Nie wiem, czy istnieje sposób logowania się do tej samej sesji co LocalSystem.

Niektóre inne alternatywy mogą polegać na ustawieniu procesu zdalnego monitorowania i użyciu jvisualvm (z samego serwera lub innego komputera) w celu połączenia się przez port i wykonania zrzutu wątku.

+16

Rozwiązanie, jeśli działa jako System lokalny: Połącz używając "mstsc/admin" przy użyciu konta logowania (nie wiesz dokładnie, jakie uprawnienia musi ono posiadać, moja należała do grupy Administratorzy) i użyj narzędzia Sysinternals psexec w następujący sposób: psexec -s "% JAVA_HOME% \ bin \ jstack.exe" PID> stack.txt Gdzie PID jest identyfikatorem procesu twojego procesu. Może być również konieczne zastąpienie rzeczywistej ścieżki do JDK w zależności od konkretnego środowiska. –

2

psexec -s jstack PID >> c:\jstack.log idealnie działa na tym samym komputerze. Po raz pierwszy zajęło to trochę czasu, ale ponownie uruchomiłem z opcją przekierowania do pliku, zakończone w kilka sekund.

Powiązane problemy