27 votes

vidage de la pile java sous Windows

J'ai un processus java en cours d'exécution dans une fenêtre de commande Windows standard. J'ai lancé 'cmd' et tapé java -jar ...

Je dois pouvoir obtenir un vidage complet de la pile de tous les threads, si possible.

Je me souviens que sous linux, vous pouvez envoyer un message à la JVM via une option de la commande quit.

sur ce document état du soleil

Pour générer une trace de la pile sous Windows 95 ou Windows NT, saisissez la commande dans le champ fenêtre dans laquelle le programme Java est s'exécute, ou cliquez sur le bouton Fermer de la fenêtre.

c'est clairement faux, car la fermeture du terminal ne fait rien d'autre que de tuer le processus et de fermer la fenêtre.

1voto

user242275 Points 574

Les autres posters ont raison - ctrl-break dans la console ou jstack.

Sinon, si vous utilisez Java 1.5 ou une version supérieure, vous pouvez obtenir ces informations par programmation au moment de l'exécution, via :

Thread.getAllStackTraces() ( [http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Thread.html#getAllStackTraces()](http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Thread.html#getAllStackTraces()) )

puis itérer à travers les résultats.

Un peu long, mais quelque chose comme ça :

Map<Thread,StackTraceElement[]> traces = Thread.getAllStackTraces();
Iterator<Thread> i = traces.keySet().iterator();
while (i.hasNext()) {
   Thread thd = i.next();
   System.out.println("*** Thread id"+thd.getId()+":"+thd.getName()+" ***");
   StackTraceElement[] trace = traces.get(thd);
   for (int j=0; j < trace.length; ++j) {
      System.out.println(trace[j]);
   }
   System.out.println();
}

Vous pouvez ensuite choisir la méthode que vous voulez pour piéger votre programme afin que cela se produise, et formater/diriger la sortie.

L'inconvénient de cette méthode est qu'elle n'est pas exacte, dans la mesure où il n'est pas garanti que les piles des différents fils aient été prises exactement au même moment. Cependant, elle présente un avantage en termes de performances, car l'ensemble du processus n'est pas suspendu pendant la prise de l'instantané.

0voto

Fortyrunner Points 8072

Jetez un coup d'œil à cet article de Stack Overflow.

vidage programmatique du thread /JDI (Java Debugger Interface)

Nous avons implémenté une méthode JMX pour récupérer les traces de la pile. C'est très pratique car vous pouvez examiner les traces de la pile dans un navigateur Web, même sur une machine distante.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X