2009-05-25 9 views
27

Ich versuche, Jstack-Befehl auf meiner Java-Anwendung auszuführen. Anwendung ist ziemlich groß und läuft innerhalb von jboss AS etwa 4 GB Speicher belegt. Betriebssystem ist Windows Server 2003 Standard Edition. Jedes Mal, wenn ich einen Fehler erhalte, steht "Nicht genügend Speicher zur Verfügung, um diesen Befehl zu verarbeiten". Es gibt genug RAM, 16 GB und Speicherplatz. Also, irgendwelche Ideen?Jstack und nicht genug Speicher ist verfügbar, um diesen Befehl zu verarbeiten

+3

Das scheint eine Windows-Fehlermeldung zu sein. –

+0

Ich habe es auf einem Tomcat, der 280 mb nimmt. – ripper234

+0

Auch diese Frage - http://stackoverflow.com/questions/222108/getting-the-java-thread-id-and-stack-trace-of-run-away-java-thread Es nicht ' t helfen, da jconsole die Anwendung nicht sieht. – ripper234

Antwort

43

ich in diesem vor kurzem lief auf Win2008r2 und dachte, dass ich meine Lösung teilen würde, da es dauerte eine Weile, um herauszufinden. Rob's comment about psexec -s hat es für mich getan.

Es scheint, dass auf Vista und später jstack wegen des Benutzerkontextes nicht gegen Dienste arbeitet. Es hat nichts mit der Erinnerung zu tun. Ich vermute, das ist der gleiche Grund, warum die Leute dieses Problem 2003 über den Remote-Desktop gesehen haben, es sei denn, Sie verwenden den Schalter/admin oder/console auf mstsc. Ab Vista ist die verschärfte Sicherheit wahrscheinlich das, was es kaputt gemacht hat.

Starten meiner App von einem Cmd-Fenster hat gut funktioniert, aber das hilft mir nicht, unsere Standardinstallation zu debuggen. Die Aktivierung des Java-Debug-Ports (für VisualVM, Eclipse oder den meisten anderen Java-Debugger) erfordert einen Neustart der App, sodass Sie den Status verlieren, den Sie wahrscheinlich erfassen möchten, wenn das Debuggen noch nicht aktiviert ist. Das Starten des Dienstes unter meinen Benutzerdaten hat nicht funktioniert - ich war etwas überrascht. Aber psexec -s läuft jstack aus dem Systemkontext, der wie ein Zauber wirkte. Oh, und Sie müssen psexec von einem erhöhten Befehl ausführen, wenn UAC eingeschaltet ist.

+0

Das hat einfach super für mich funktioniert. –

+1

dito. Danke für die Rettung meines Tages –

+0

Das funktioniert gut mit Win 2003. Vielen Dank – dAm2K

3

Wir hatten Probleme mit JStack auf einem Windows-Rechner mit nur einer bescheidenen Anwendung (1 GB). Am Ende haben wir unsere Stack- und Heap-Analyse mit Netbeans durchgeführt. Dies schien das Parsen von Dump-Dateien viel besser zu bewältigen. YMMV.

Geben Sie Netbeans einen Versuch zum Profiling - es ist sehr gut. Beachten Sie, dass VisualVM ein Cutdown-NB-Profiler ist und mit 6u7 geliefert wird.

7

In der Vergangenheit habe ich das gesehen habe, wenn die JVM als Windows-Dienst unter Windows 2003 läuft

Zuerst überprüfen, um zu sehen, ob dies ein issue with the TMP directory ist.

Zweitens wird jstack (oder die anderen Dienstprogramme wie jconsole) keine Verbindung zum lokalen Prozess herstellen, es sei denn, es wird in derselben Sitzung ausgeführt. Wenn der Dienst als bestimmter Benutzer ausgeführt wird, können Sie möglicherweise eine Verbindung herstellen, indem Sie sich bei derselben Sitzung anmelden. Wenn Sie Remotedesktop verwenden, können Sie eine Verbindung mit "mstsc/admin" herstellen (früher war dies/console) und versuchen, jstack erneut auszuführen. Überprüfen Sie auf jeden Fall, ob das TMP-Verzeichnis richtig eingestellt ist, wenn das Problem dadurch nicht behoben wird.

Wenn der Dienst als LocalSystem ausgeführt wird, wird die obige Prozedur wahrscheinlich nicht viel helfen. Ich weiß nicht, ob es eine Möglichkeit gibt, sich in derselben Sitzung wie LocalSystem anzumelden.

Einige andere Alternativen können sein, den Prozess für die Fernüberwachung einzurichten und jvisualvm (vom Server selbst oder einer anderen Maschine) zu verwenden, um sich über einen Port zu verbinden und einen Thread-Dump auszuführen.

+16

Lösung, wenn es als lokales System ausgeführt wird: Connect „mstsc/admin“ mit einem Login-Konto (nicht sicher, genau Berechtigungen es haben muss, war mein in der Gruppe Administratoren) und das Sysinternals psexec Tool wie folgt: psexec -s "% JAVA_HOME% \ bin \ jstack.exe" PID> stack.txt Dabei ist PID die Prozess-ID Ihres Prozesses. Je nach Ihrer spezifischen Umgebung müssen Sie möglicherweise auch den tatsächlichen Pfad zu Ihrem JDK ersetzen. –

0

Dies ist eine Fehlermeldung vom zugrunde liegenden O/S. Es gibt nicht viel, was Sie in Ihrem Code tun können, um mit diesem anderen umzugehen, als die Ausnahme zu fangen, die geworfen wird. Boo zu Windows, um so begrenzt zu sein.

http://technet.microsoft.com/en-us/library/cc978735.aspx

2

psexec -s jstack PID >> c:\jstack.log funktioniert perfekt auf der gleichen Maschine. Zum ersten Mal hat es etwas gedauert, aber wieder habe ich mit der Redirect-to-File-Option ausgeführt, die in wenigen Sekunden erledigt ist.