2010-06-04 21 views
3

Je cherche à écrire du code de surveillance qui s'exécute dans une application Java et prend périodiquement un instantané des threads en cours d'exécution et affiche des informations sur la pile des appels sur chacun d'eux.Pouvez-vous suspendre une application Java et obtenir un instantané de ses discussions à partir de l'application?

Idéalement, cela serait étendu pour le profilage et/ou la surveillance.

Je ne veux pas utiliser un outil externe, car c'est à des fins d'auto-éducation.

Répondre

4

Avez-vous essayé Thread.getAllStackTraces()

+0

Je ne crois pas qu'il existe un moyen d'arrêter tous les threads (à partir du code octet Java). Si vous lancez la JVM elle-même en utilisant JNI, il y a _might_ être un moyen. – Justin

+0

merci c'est bon pour mes fins – justinhj

1

Avez-vous examiné les méthodes de la classe Thread telles que Thread.enumerate(), Thread.activeCount(), Thread.getName()?

3

Jetez un oeil à ThreadMXBean.dumpAllThreads(boolean, boolean)

ThreadMXBean bean = ManagementFactory.getThreadMXBean(); 
ThreadInfo[] info = bean.dumpAllThreads(true, true); 
1

Vous pouvez enregistrer les fils que vous voulez regarder au moment de la création, et un fil de paramètres séparés pour faire le suivi. Vous souhaitez créer certaines métriques dans le fil de discussion, par exemple une liste des temps d'exécution récents, le débit actuel ou d'autres types de statistiques.

0

kill -SIGQUIT {} java_process

videra toutes les traces de la pile dans le stdout du processus java.