Prenez un thread dump avec jstack ou jcmd, idéalement deux à quelques secondes d'intervalle, et regardez les threads bloqués. La JVM détecte les cycles de verrous et affiche directement une section de deadlock au niveau Java. S'il n'y a pas de cycle, les threads sont probablement bloqués sur une ressource comme un pool de connexions ou une lecture de socket sans délai d'expiration. Corrigez en ordonnant les verrous de façon cohérente, en réduisant la section critique, ou en ajoutant des délais d'expiration.
Pourquoi les recruteurs posent cette question
Le recruteur veut savoir si vous savez déboguer une JVM en fonctionnement et pas seulement lire du code. Dégainer immédiatement un thread dump, et savoir que la JVM vous nomme le deadlock, est le signal de crédibilité. Il sonde aussi la prévention : ordre de verrouillage cohérent, tryLock avec délai d'expiration, et ne jamais faire d'appel distant en tenant un verrou, ce qui est la façon dont naissent la plupart des vrais deadlocks.
Comment structurer votre réponse
- Prenez plusieurs thread dumps et comparez ce qui est bloqué.
- Cherchez la section deadlock, puis les états blocked et waiting.
- Distinguez un cycle de verrous d'une famine de ressource ou d'un délai d'expiration manquant.
- Donnez les règles de prévention que vous appliquez dans le code.
Exemple de réponse
La première chose, c'est un thread dump, et j'en prends deux ou trois à quelques secondes d'intervalle pour distinguer ce qui est vraiment bloqué de ce qui est simplement occupé. La JVM fait beaucoup du travail ici : si deux threads détiennent mutuellement leurs moniteurs, elle affiche une section de deadlock au niveau Java qui nomme les deux threads et les deux verrous, et les traces de pile me disent exactement quelles méthodes regarder. S'il n'y a pas de cycle, le motif est en général différent : des dizaines de threads tous en attente sur le même pool de connexions, ce qui veut dire que quelque chose retient des connexions plutôt qu'un deadlock classique, ou des threads bloqués dans une lecture de socket sans délai d'expiration configuré, ce qui pend indéfiniment quand un pair cesse de répondre. Pour la prévention j'ai quelques règles. Les verrous sont pris dans un ordre cohérent, et je documente cet ordre quand il y en a deux. Je garde la section critique aussi petite que possible et je ne fais jamais d'appel réseau ni de publication de message en tenant un verrou. Et quand la conception le permet, j'utilise tryLock avec un délai d'expiration, pour que la contention dégénère en erreur traitée plutôt qu'en blocage.
Vous passez cet entretien bientôt ? GhostPilot écoute votre appel en direct, repère la question dès qu'elle est posée et affiche une réponse structurée à l'écran en temps réel. Essayez-le lors de votre prochain entretien blanc, ou prenez un Session Pass à $29, sans abonnement, pour le jour J.
Voir comment ça marcheQuestions de relance à prévoir
- Comment obtenez-vous un thread dump depuis un conteneur sans shell ?
- Quelle est la différence entre blocked, waiting et timed waiting dans un dump ?
- Comment reproduiriez-vous un deadlock suspecté dans un test ?
Autres questions pour Développeur Java
Votre recruteur posera sa propre version de celle-ci. Collez votre véritable fiche de poste dans le Question Predictor gratuit et obtenez les 20 questions que ce poste a le plus de chances de poser, avec ce que chacune cherche vraiment à sonder.
Prédire mes questions