Como encontrar um loop infinito em um aplicativo da web java?
-
28-10-2019 - |
Pergunta
Um dia, nosso aplicativo da web java chega a 100% do uso da CPU. Uma reinicialização resolve o incidente, mas não o problema porque algumas horas depois que o problema voltou. Suspeitamos de um loop infinito introduzido por uma nova versão, mas não fizemos nenhuma alteração no código ou no servidor.
Conseguimos encontrar o problema fazendo vários despejos de thread com kill -QUIT e observando e comparando todos os detalhes de thread. Descobrimos que uma pilha de chamadas de thread aparece em todos os despejos de thread. Após a análise, houve uma condição de loop while que nunca foi falsa para alguns dados que eram atualizados regularmente no banco de dados.
A análise de vários despejos de thread de aplicativos da web é realmente tediosa.
Então, você conhece alguma forma ou ferramenta melhor de encontrar esse problema em um ambiente de produção?
Solução
Depois de algumas consultas, encontrei uma resposta em Monitorando e gerenciando Java Aplicativos da plataforma SE 6 :
Você pode diagnosticar o encadeamento em loop usando a ferramenta fornecida pelo JDK chamada JTop que mostrará o tempo de CPU que cada encadeamento está usando:
Com o nome do thread, você pode encontrar o rastreamento de pilha deste thread na guia “Threads” fazendo um despejo de thread com um kill -QUIT.
Agora você pode se concentrar no código que causa o loop infinito.
PS: Parece correto responder minha própria pergunta de acordo com http: / /blog.stackoverflow.com/2008/07/stack-overflow-private-beta-begins/ : […] “sim, está tudo bem e até mesmo encorajado a responder suas próprias perguntas, se você encontrar uma boa resposta antes de qualquer outra pessoa.” […]
PS .: Caso o domínio sun.com não exista mais: Você pode executar JTop como uma GUI independente:
$ <JDK>/bin/java -jar <JDK>/demo/management/JTop/JTop.jar
Como alternativa, você pode executá-lo como um plug-in JConsole:
$ <JDK>/bin/jconsole -pluginpath <JDK>/demo/management/JTop/JTop.jar
Outras dicas
Pense em usar ferramentas de cobertura como o Cobertura. Teria mostrado que você não testou esses caminhos de código.
Testando sth.como isso pode se tornar muito complicado, então tente evitar isso introduzindo medidas de qualidade.
De qualquer forma, ferramentas como o VisualVM darão a você uma boa visão geral de todos os threads, tornando-se relativamente fácil identificar threads que estão funcionando por um tempo inesperadamente longo.