Question

J'aime générer un vidage de thread par programme. J'ai appris qu'il y a fondamentalement deux façons de le faire:

  1. Utilisez l’interface "Java Virtual Machine Tool" " JVM-TI
  2. Utilisez l’interface "Java Debugger Interface" plus abstraite et plus abstraite. JDI

Pour la JVM-TI, j’ai pu trouver des informations utiles, mais j’aurais dû écrire une DLL JNI que, du moins pour le moment, j’aimerais éviter. Avec le JDI, je peux utiliser Java et il semble que je puisse l’utiliser depuis l’application. Mais je n'ai pas réussi à trouver un tutoriel ou un HOWTO pour cela. La seule documentation que j'ai pu trouver était Java-Docs http: //java.sun.com/j2se/1.5.0/docs/guide/jpda/jdi/ qui n'est pas très utile, car cela ne me montre pas comment utiliser ces classes.

Alors, est-ce que quelqu'un connaît un bon tutoriel / livre que je pourrais lire?

Merci pour toute aide!

Était-ce utile?

La solution

Avez-vous envisagé l’alternative distante? C'est à dire. VisualVM

le vidage mémoire avec visualVM

jps et jstack sont également des outils utiles inclus dans JDK 5, fournissant une méthode de ligne de commande rapide pour obtenir des traces de pile de tous les threads en cours.

Cet article suggère que JDI est également utilisé comme outil distant .

Je ne suis donc pas sûr que vous puissiez déclencher un vidage de thread au sein de votre propre programme. Vous trouverez plutôt un moyen de vous envoyer un signal SIGQUIT (kill -3) sur les plates-formes Unix, ou d'appuyer sur la touche Ctrl + \ sous Unix ou Ctrl-Break sur les plateformes Windows.

De plus, JDI n'était pas destiné à être utilisé pour déboguer le même processus. dans lequel le client JDI est en cours d'exécution . Pourtant, ce fil que je viens de lier est le plus proche que j’ai trouvé pour utiliser réellement JDI dans le même programme.

Autres conseils

Il existe un troisième moyen: Thread.getAllStackTraces ()

http: // java. sun.com/javase/6/docs/api/java/lang/Thread.html#getAllStackTraces ()

C’est beaucoup plus simple que l’interface du débogueur ...

Vous pouvez obtenir à peu près toutes les informations sur les discussions dont vous avez besoin, y compris les blocages http://java.sun.com/javase/6/docs/api/java/lang/management/ThreadMXBean.html

Thread.getAllStackTraces () vide uniquement la trace d'exécution de tous les threads, mais ne donne pas les informations sur les verrous d'objet obtenus par un thread particulier ni sur le verrou sur lequel un thread particulier attendait. Fondamentalement, nous ne pourrons pas bloquer les impasses avec cela.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top