Pergunta de entrevista para Desenvolvedor Java

Requisições para um endpoint travam para sempre enquanto o resto do serviço está bem. Como você diagnostica?

O que o entrevistador está avaliando, como estruturar sua resposta e um exemplo falado que você pode adaptar.

Resposta rápida

Tire um thread dump com jstack ou jcmd, de preferência dois com alguns segundos de diferença, e olhe as threads travadas. A JVM detecta ciclos de lock e imprime uma seção de Java level deadlock direto. Se não há ciclo, as threads provavelmente estão bloqueadas num recurso como um pool de conexões ou uma leitura de socket sem timeout. Corrija ordenando os locks de forma consistente, encurtando a seção crítica ou adicionando timeouts.

Por que os entrevistadores perguntam isso

O entrevistador quer saber se você consegue depurar uma JVM viva em vez de só ler código. Apelar para um thread dump imediatamente, e saber que a JVM nomeia o deadlock para você, é o sinal de credibilidade. Eles também sondam prevenção: ordenação consistente de locks, tryLock com timeout e nunca fazer uma chamada remota segurando um lock, que é como a maioria dos deadlocks reais é de fato criada.

Como estruturar sua resposta

  • Tire vários thread dumps e compare o que está travado.
  • Procure a seção de deadlock, depois os estados blocked e waiting.
  • Distinga um ciclo de lock de falta de recurso ou de um timeout ausente.
  • Dê as regras de prevenção que você aplica no código.

Exemplo de resposta

Exemplo falado, em primeira pessoa

A primeira coisa é um thread dump, e eu tiro dois ou três com alguns segundos de diferença para distinguir o que está genuinamente travado do que só está ocupado. A JVM faz boa parte do trabalho aqui: se duas threads seguram os monitores uma da outra, ela imprime uma seção de Java level deadlock nomeando as duas threads e os dois locks, e aí os stack traces me dizem exatamente quais métodos olhar. Se não há ciclo, o padrão costuma ser diferente: dezenas de threads em estado de espera no mesmo pool de conexões, o que significa que algo está segurando conexões em vez de um deadlock clássico, ou threads bloqueadas numa leitura de socket sem timeout configurado, o que trava indefinidamente quando o outro lado para de responder. Para prevenção eu tenho algumas regras. Locks são adquiridos numa ordem consistente, e eu documento essa ordem quando há dois. Eu mantenho a seção crítica o menor possível e nunca faço uma chamada de rede nem publico mensagem segurando um lock. E onde o design permite eu uso tryLock com timeout, para que a contenção degrade em erro tratado em vez de travamento.

Vai encarar essa entrevista em breve? O GhostPilot escuta a sua chamada ao vivo, identifica a pergunta no instante em que ela é feita e coloca uma resposta estruturada na sua tela em tempo real. Teste na sua próxima entrevista simulada ou pegue um Session Pass de $29, sem assinatura, para a hora da verdade.

Veja como funciona

Perguntas de acompanhamento que você pode esperar

  • Como você tira um thread dump de um container sem shell?
  • Qual é a diferença entre blocked, waiting e timed waiting num dump?
  • Como você reproduziria um deadlock suspeito num teste?

Mais perguntas para Desenvolvedor Java

Seu entrevistador vai fazer a própria versão desta. Cole a descrição real da vaga no Question Predictor gratuito e receba as 20 perguntas que essa vaga tem mais chance de fazer, com o que cada uma está de fato sondando.

Prever minhas perguntas

Ensaie as perguntas difíceis antes que elas apareçam

Pratique com um copiloto ao vivo e depois entre pronto. Um Session Pass de $29 te leva até o fim da entrevista, sem assinatura e sem amarras.

Instalar o GhostPilot