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?

Foi útil?

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:  insira a descrição da imagem aqui

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

Corrija o problema antes que ele ocorra!Use uma ferramenta de análise estática como FindBugs ou PMD como parte de seu sistema de compilação.Não encontrará tudo, mas é um bom primeiro passo.

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top