2008-09-18 21 views
5

Est-il possible d'obtenir un vidage de thread d'une application Java Web Start? Et si oui, comment?Comment créer un vidage de thread d'une application Java Web Start

Ce serait bien s'il y avait une solution simple, ce qui permettrait à un non-développeur (client) de créer un vidage de thread. Alternativement, est-il possible de créer un vidage de thread par programmation?

Dans la console Java Web Start, je peux obtenir une liste de threads en appuyant sur 't' mais les stacktraces ne sont pas inclus.

Si les réponses nécessitent certaines versions de Java, veuillez le préciser.

Répondre

6

Dans la console, appuyez sur V plutôt que T:

t: dump thread list 
v: dump thread stack 

Cela fonctionne sous JDK6. Je ne sais pas pour les autres.

Alternative, sous JDK5 (et peut-être plus tôt), vous pouvez envoyer une trace complète de la pile de toutes les discussions sur la sortie standard:

Sous Windows: Type ctrl-break dans la console Java.

Sous Unix:kill -3 <java_process_id> (par exemple tuer -3 5555). Cela ne va pas tuer votre application.

Une autre chose: Comme d'autres le disent, vous pouvez obtenir les piles par programmation via la classe Thread, mais attention à Thread.getAllStackTraces() avant JDK6 car il y a une fuite de mémoire.

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

Cordialement,

scotty

2

Essayez

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

Ensuite, vous pouvez parcourir la collection pour montrer les principaux éléments x pile qui vous intéressent.

2

JDKs récentes (malheureusement pas JREs) comprennent des outils tels que jstack qui fait telle des choses. Les JVM de la version 5 incluent des extensions JMX pour obtenir des vidages de threads, des statistiques de mémoire et bien plus encore. Toutes les applications Java, y compris les applications de démarrage Web, ont cette fonctionnalité disponible.

Vous devez installer le JDK ou écrire un client JMX qui fait la même chose. Jetez un oeil à http://java.sun.com/javase/6/docs/technotes/guides/management/ pour obtenir plus d'informations.

0

Depuis Java 5, vous avez la méthode getStackTrace() de la classe Thread. Pour les versions antérieures, vous pouvez faire:

Thread.currentThread().dumpStack(); 

Cette imprimera la trace de la pile à System.out

+0

Cela donne seulement pour le thread courant, pas toutes les discussions. –

2

Depuis 1.5, vous pouvez utiliser Thread.getAllStackTraces() pour obtenir un Map à itérer.

La sortie idéale serait celle produite par Ctrl- (ou Ctrl-Break ou similaire), mais il ne semble pas y avoir de moyen documenté de produire ceci. Si vous souhaitez vous limiter à la JVM de Sun (ou utiliser la réflexion, je suppose), vous pouvez faire un tour autour des packages sun.* et voir si quelque chose d'intéressant apparaît.