2008-09-18 8 views
5

Ist es möglich, einen Thread-Dump einer Java Web Start-Anwendung abzurufen? Und wenn ja, wie?Wie erstelle ich einen Thread-Dump einer Java Web Start-Anwendung?

Es wäre schön, wenn es eine einfache Lösung gäbe, die es einem Nicht-Entwickler (Kunden) ermöglichen würde, einen Thread-Dump zu erstellen. Alternativ ist es möglich, einen Thread-Dump programmgesteuert zu erstellen?

In der Java Web Start Console kann ich eine Liste von Threads abrufen, indem ich 't' drücke, aber Stacktraces sind nicht enthalten.

Wenn Antworten bestimmte Java-Versionen erfordern, sagen Sie es bitte.

Antwort

6

in der Konsole drücken V statt T:

t: dump thread list 
v: dump thread stack 

Das unter JDK6 arbeitet. Ich weiß nichts über andere.

Alternative, unter JDK5 (und früher möglicherweise) Sie können einen vollständigen Stack-Trace aller Threads an die Standardausgabe senden:

unter Windows: Typ ctrl-Pause in der Java-Konsole.

Unter Unix:kill -3 <java_process_id> (z töten -3 5555). Dies wird deine App NICHT töten.

Eine andere Sache: Wie andere sagen, können Sie die Stacks programmatisch über die Thread Klasse erhalten, aber achten Sie auf Thread.getAllStackTraces() vor JDK6, da es ein Speicherleck ist.

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6434648

Grüße,

scotty

2

Versuchen

StackTraceElement[] stack = Thread.currentThread().getStackTrace(); 

Dann sind Sie über die Sammlung iterieren können die oben x Stapelelemente zu zeigen, die Sie interessieren.

2

Aktuelle JDKs (leider nicht JREs) gehören Werkzeuge wie jstack, die so tut Dinge. JVMs von Version 5 enthalten JMX-Erweiterungen, um Thread-Dumps, Speicherstatistiken und vieles mehr zu erhalten. Alle Java-Anwendungen, einschließlich Web-Start-Anwendungen, verfügen über diese Funktionalität.

Sie müssten entweder das JDK installiert haben oder einen JMX-Client schreiben, der das Gleiche tut. Werfen Sie einen Blick auf http://java.sun.com/javase/6/docs/technotes/guides/management/, um weitere Informationen zu erhalten.

0

Seit Java 5 haben Sie die getStackTrace() - Methode der Thread-Klasse. Für ältere Versionen können Sie tun:

Thread.currentThread().dumpStack(); 

Dadurch wird der Stack-Trace zu System.out

+0

, die nur für den aktuellen Thread gibt, nicht alle Threads. –

2

Seit 1.5 drucken können Sie Thread.getAllStackTraces() verwenden, um eine Map zu iterieren zu bekommen.

Die ideale Ausgabe wäre die, die von Ctrl- \ (oder Ctrl-Break oder ähnlich) erzeugt wird, aber es scheint keine dokumentierte Möglichkeit zu sein, dies zu erzeugen. Wenn Sie bereit sind, sich auf die JVM der Sonne zu beschränken (oder Reflektion zu verwenden, denke ich), könnten Sie die Pakete sun.* durchsuchen und sehen, ob etwas Interessantes auftaucht.