2010-10-18 19 views
7

J'ai un Tomcat en cours d'exécution en tant que service Windows, et ceux-ci sont connus pour ne pas fonctionner correctement avec jstack. jconsole fonctionne bien, d'un autre côté, et je peux voir des piles de threads individuels (je me connecte à "localhost: port" pour y accéder). Comment utiliser jconsole ou un outil similaire pour vider toutes les piles de threads dans un fichier?Comment créer un vidage de thread via JMX?

(similaire à jstack)

Répondre

5

Vous pouvez utiliser l'interface de gestion ThreadMXBean.

Cette classe FullThreadDump illustre la capacité d'obtenir un vidage de thread complet et de détecter également les interblocages à distance à l'aide de JMX.

3

Voici un autre exemple de code qui va écrire une décharge de la pile dans un fichier:

http://pastebin.com/zwcKC0hz

Nous utilisons ce sur JMX pour nous donner une approximation de la pile vous décharge obtenez lorsque vous faites une requête JMX ou si le processus détecte une charge élevée et inattendue.

4

De nos jours, vous pouvez utiliser l'outil jvisualvm pour vous connecter à votre JVM distante via JMX et créer un vidage de thread. Je ne sais pas si cela était disponible

Java VisualVM

+1

C'est incroyablement lent :( –

1

Il serait utile si vous prenez un enregistrement de vol pour obtenir une vue plus profond sur le comportement JVM, en se concentrant particulièrement sur les méthodes Hot.

Habituellement, un enregistrement d'une demi-heure est suffisant. Pour déclencher un enregistrement, vous devez être connecté aux machines et exécutez la commande suivante:

Si vous utilisez 1.8.x Java HotSpot:

$ JAVA_HOME/bin/jcmd VM.unlock_commercial_features $ JAVA_HOME/bin/jcmd JFR.start durée = paramètres = 1800 nom du fichier de profil =/tmp/recording.jfr

Si vous utilisez 1.7.x HotSpot java:

Modifier votre $ HOME/conf/wrapper.conf par adjonction, paramètres au démarrage de la machine virtuelle Java:

wrapper.java.additiona = - XX:. + UnlockCommercialFeatures wrapper.java.additional = - XX:. +

enregistreur de vol

(remplacer par le numéro de position correspondant)

Ensuite, ont vos instances redémarré. Une fois fait, exécutez la commande suivante:

$ JAVA_HOME/bin/jcmd JFR.start durée = réglages des années 1800 = nom du fichier de profil =/tmp/recording.jfr

L'enregistrement de vol wil produire un fichier sur/tmp/enregistrement.jfr à la résiliation.