Programmatique de détection de blocage en java
Comment puis-je par programme détecter qu'un blocage a eu lieu dans un programme Java?
- Vous devez préciser si vous avez besoin de détecter ce par programme ou par une sorte de contrôle externe de l'outil?
- la détection par programmation..
- Le JavaSpecialist site (toujours la peine de lire) a un article sur ce, de discuter de la théorie et de la pratique.
- Ah, ma réponse est en supposant à l'aide d'un outil. Je suppose qu'il est utile de connaître les deux approches, de toute façon.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez le faire par programmation à l'aide de la
ThreadMXBean
fourni avec le JDK:Évidemment, vous devriez essayer d'isoler selon thread effectue cette impasse check - Sinon, si ce thread blocages, il ne sera pas en mesure d'exécuter le chèque!
D'ailleurs c'est ce que JConsole est à l'aide de sous les couvertures.
Un indice utile pour l'enquête:
Si vous pouvez attraper la demande de la main dans le sac et que vous soupçonnez un blocage a eu lieu, go et appuyez sur "Ctrl-Pause" dans le java.exe fenêtre de la console (ou "Ctrl-\" sur Solaris/Linux).
La jvm d'un dumping de la situation actuelle et la trace de la pile de tous les threads, découvrez les serrures et de décrire avec précision eux.
Il ressemblera à quelque chose comme ceci:
Vous pouvez détecter l'impasse du fils par programmation à l'aide ThreadMXBean classe.Voici le code,
Cliquez sur ici pour plus d'informations sur la façon de détecter l'impasse du fils.
JArmus est une bibliothèque pour la détection de blocage et l'évitement. Il inclut un support pour:
Thread.join
,CyclicBarrier
,CountDownLatch
,Phaser
, etReentrantLock
.À utiliser JArmus vous avez besoin pour instrument de votre code. Soit par le biais de l'un de ses instrumentation des classes, ou automatiquement avec l'JArmus instrumentar
jarmusc
.java -jar jarmusc.jar yourprogram.jar checkedprogram.jar
L'entrée
yourprogram.jar
est le programme que vous souhaitez vérifier.Le résultat est le même programme avec des chèques de trouver automatiquement un blocage.
Obstacles besoin de l'aide
Vérifier les blocages avec les classes
CyclicBarrier
,CountDownLatch
,Phaser
est un peu délicat --- par exemple, JConsole ne peut pas détecter ces types de blocages. JArmus besoin d'un peu d'aide de vous: vous devez spécifier les threads sont influençant la synchronisation, nous appelons ces enregistré threads.Dès que possible, le thread doit marquer lui-même enregistré. Un bon endroit pour marque enregistrée fils est au début de la méthode
Runnable.run
.JArmus.register(latch);
Exemple
Le programme suivant qui blocages est correctement identifié par
JArmus:
Vous pourriez envisager de IBM MTRAT. Mieux vaut prévenir que guérir, après tout. Le Multicœur Kit De Développement Logiciel est également livré avec un blocage de l'outil de détection.
Si vous n'avez pas besoin programmatique de détection, vous pouvez le faire via le JConsole; sur le fil onglet "détection de blocage de la touche"". Dans JDK6 ce détecter des serrures pour les deux intrinsèque des moniteurs et
j.u.c
Lock
sCourir jusqu'à la JConsole via le
$JAVA_HOM/bin/jconsole
commandeIl est le code ici: http://www.java2s.com/Code/Java/Development-Class/PerformingdeadlockdetectionprogrammaticallywithintheapplicationusingthejavalangmanagementAPI.htm
La magie qui se passe dans
ThreadMonitor.findDeadlock()
:Cela appelle une API de la
ThreadMXBean
qui a un nom différent dans Java 5 et 6 (d'où l'extérieurif()
).L'exemple de code permet également d'interrompre les serrures, de sorte que vous pouvez même sortir de l'impasse.
tempus fugit met également en œuvre avec un programmatique fil dumping classe. Il est mis en œuvre à l'aide du mbean mécanisme mentionné ci-dessus et offre un drop in, out-of-the-box super duper solution.
Dans le cas où vous voulez qu'il soit fait dans les temps, vous pouvez utiliser chien de garde pour que.