2010-01-28 6 views
0

J'ai un programme Java, avec multi threading. Mon problème est que de temps en temps, j'ai un délai d'attente. Parce que j'ai quelques trucs Unix je ne peux pas voir où est le timeout ou/et le verrouillage. Le problème est que cela n'arrive pas tous les soirs, seulement de temps en temps. En fait, un composant unix (lsf) tue le thread (si le délai dépasse 15 minutes). Donc, parce que je ne peux pas voir où est le problème, je me demandais si quelqu'un a une idée. Y at-il une chance de lancer un autre java quelque chose et quand j'ai un verrou, d'écrire un fichier journal? Si oui, que serait-il?Java multithreading - détecter automatiquement thread bloqué

+1

comme quelqu'un l'avait une fois écrit, la programmation multithread est de 95% de réflexion et 5% de code d'écriture. Mieux vaut donc repenser tous les scénarios de course et de blocage possibles. – Bozho

+0

Ceci est une très grande application existante. Il n'est pas possible de penser tous les scénarios. Il était déjà là quand je suis arrivé. –

Répondre

3

jstack est un programme de ligne de commande que vous pouvez utiliser pour introspecter des programmes Java. Il imprimera une trace de pile pour chaque thread, vous dira s'il est verrouillé et détectera même des blocages. Cela peut vous aider à déboguer le problème de manière interactive. Si vous voulez obtenir ces données dans votre programme, vous pouvez appeler Thread.getAllStackTraces() qui vous donnera une liste de tous les threads et de leurs traces de pile, ainsi vous pouvez voir où sont les threads et leur état, si vous voulez faire Quelque chose 'si un thread est verrouillé, comme écrire dans un fichier journal.

+0

Le problème est que je n'ai pas très souvent le problème. Donc, je pense à quelque chose comme un morceau de code qui écrit un journal chaque fois qu'il y a un verrou, et avec le nom de la méthode. De cette façon, le matin, je peux analyser le journal pour voir s'il y avait un verrou et si oui, où il était. Mais je ne sais pas comment le faire. –

+0

C'est ce que fait JCarder (voir ma réponse principale) – Rich

+0

+1 merci de mentionner Thread.getAllStackTraces() – stacker

4

Si vous devez laisser l'application en cours d'exécution et qu'elle est bloquée au mauvais moment de la journée, vous pouvez tirer parti de JCarder, qui est un agent que vous demandez à Java d'utiliser. Lorsque le programme a terminé son exécution, il sort différents fichiers de diagnostic qui peuvent ensuite être convertis en un graphique pour montrer le (s) blocage (s).

Également, exécutez votre code à travers des choses comme Findbugs, ce qui peut indiquer un subtil scénario de blocage que vous n'avez pas remarqué.

+0

Si l'application. deadlocks sûrement il est peu probable de pouvoir se terminer proprement. Est-ce que JCarder compte sur une terminaison propre avant de pouvoir produire des diagnostics? – Adamski

+0

C'est un agent, donc il a tendance à être capable de gérer la plupart des terminaisons normales. Le problème de l'OP peut être la façon dont la machine choisit de tuer le processus - si ce n'est pas d'une manière «conviviale JCarder», alors cela peut être inutile. – Rich

+0

+1 outil cool, j'espère que je n'en ai jamais besoin – stacker

1

En plus de jstack vous pouvez vérifier JConsole, qui est une application graphique qui vous permet de détecter, fil de blocages moniteur/mémoire/utilisation du processeur, etc. navires avec le JDK.

En interne, JConsole utilise ThreadMXBean, que vous pouvez également utiliser pour détecter par programme les interblocages; par exemple. J'organise généralement pour un thread démon dans mes applications serveur d'appeler périodiquement le code suivant: