2010-11-13 51 views
6

Normalement, lorsque je demande un vidage de thread, les symptômes d'un système peu performant s'expliquent facilement; c'est-à-dire que normalement je serais capable de voir qu'un certain nombre de threads attendent clairement sur un moniteur qui a été acquis mais qui n'est pas libéré par un autre.Des threads Java attendent pour verrouiller un objet qui n'est pas (visiblement) verrouillé

Dans ce cas, j'ai beaucoup de threads en attente d'un moniteur (0x965ad100), mais aucun ne semble avoir ce moniteur en premier lieu. Les fils en question peuvent être identifiés par cette signature:

attente pour verrouiller < 0x965ad100> (un uk.gov.dti.og.fox.ConAgent)

J'ai essayé googler cela, et tout ce que j'ai l'air de trouver sont des messages qui parlent des moniteurs qui sont verrouillés, rien à propos de l'attente d'un moniteur qui n'est pas verrouillé.

décharge de fil en plein: http://www.basson.at/docs/stackoverflow/thread_dump.txt

J'espère que quelqu'un ici peut expliquer ce que je vois, ou du moins me diriger dans la bonne direction. Merci d'avance pour toute réponse.

+0

BTW, vous feriez mieux de vérifier ce qui est thread-9 faire, parce qu'il attend le même verrou, il a déjà acquis (0x96560c48) –

Répondre

1

Il est possible (bien que peu probable) qu'un thread libère juste le moniteur lorsque votre vidage de thread a été effectué. Il peut y avoir une brève période entre le moment où un moniteur est relâché et le fil suivant. Si vous n'êtes pas dans une impasse réelle, cela pourrait expliquer ce que vous voyez. Essayez un autre vidage de thread et vérifiez celui-là.

Plus probablement, il y a un thread quelque part qui contient déjà le moniteur. Parfois, ce n'est pas évident. Les traces de votre pile ont des lignes "verrouillées" qui listent les threads qui contiennent certains verrous, mais cette liste n'est pas nécessairement complète. Par exemple, je suspecte que les verrous obtenus via JNI ne sont pas listés.

Si vous pouviez remplacer le verrou intégré par, par ex. java.util.concurrent.locks.ReentrantLock, alors vous pouvez suspendre le programme et attacher un débogueur, trouver le verrou qui vous intéresse et trouver le propriétaire du verrou en utilisant la méthode getOwner.

1

Si vous utilisez Eclipse, vous pouvez utiliser la visionneuse de verrouillage intégrée via la vue Débogage, ce qui peut s'avérer utile. Vous pouvez l'activer en utilisant le menu déroulant accessible via la flèche vers le bas dans la barre d'outils :)

alt text