Se você tiver um aplicativo Java que consome CPU quando não está fazendo nada, como determinar o que ele está fazendo?

StackOverflow https://stackoverflow.com/questions/12927

  •  08-06-2019
  •  | 
  •  

Pergunta

Estou ligando para a API Java de um fornecedor e, em alguns servidores, parece que a JVM entra em um loop de pesquisa de baixa prioridade após fazer login na API (CPU com 100% de uso).O mesmo aplicativo em outros servidores não apresenta esse comportamento.Isso acontece no WebSphere e no Tomcat.O ambiente é complicado de configurar, por isso é difícil tentar fazer algo como criar perfis no Eclipse.

Existe uma maneira de traçar o perfil (ou algum outro método de inspeção) de um aplicativo Java existente em execução no Tomcat para descobrir quais métodos estão sendo executados enquanto ele está nesse tipo de estado de spinwait?O aplicativo está executando apenas um método quando chega nesse estado (método do fornecedor).O fornecedor não pode replicar o comportamento (é claro).


Atualizar:

Usando o JConsole, consegui determinar quem estava executando e o que estava fazendo.Levei algumas horas para descobrir por que isso estava acontecendo.O problema acabou sendo que o jar da API do fornecedor que estava sendo usado não correspondia exatamente à configuração do banco de dados que estava usando.O padrão era ter o rastreamento e o monitoramento de desempenho habilitados nos servidores que apresentavam uma ligeira incompatibilidade na configuração.Usei um pote diferente e está tudo bem.

Então, obrigado, Joshua, pela sua resposta.O JConsole foi extremamente fácil de configurar e usar para monitorar um aplicativo existente.

@Cringe - fiz algumas experiências com algumas das opções que você sugeriu.Tive alguns problemas ao configurar o JProfiler, parece bom (mas caro).Daqui para frente, adicionei o plug-in Eclipse Profiler e examinarei os diferentes criadores de perfil de código aberto para comparar a funcionalidade.

Foi útil?

Solução

Se você estiver usando Java 5 ou posterior, poderá conectar-se ao seu aplicativo usando jconsole para visualizar todos os threads em execução.jstack também fará um dump de pilha.Acho que isso ainda deve funcionar mesmo dentro de um contêiner como o Tomcat.

Ambas as ferramentas estão incluídas no JDK5 e posteriores (presumo que o processo precise ser pelo menos Java 5, embora eu possa estar errado)

Atualizar:Também é importante notar que, a partir da atualização 7 do JDK 1.6, agora existe um criador de perfil incluído chamado VisualVM que pode ser iniciado com 'jvisualvm'.Parece que é um projeto java.net, portanto, informações adicionais podem estar disponíveis nessa página.Ainda não usei isso, mas parece útil para análises mais sérias.

espero que ajude

Outras dicas

Enfrentando o mesmo problema que usei Perfilador YourKit.Seu carregador não é ativado a menos que você realmente se conecte a ele (embora abra uma porta para escutar conexões).O criador de perfil em si tem uma boa "quantidade de tempo gasto em cada método" enquanto trabalha em seu modo menos invasivo.

Outra maneira é detectar a carga da CPU (via JNI, então você precisaria de uma biblioteca externa para isso) em um thread "watchdog" com prioridade mais alta e começar a registrar todos os threads quando a CPU estiver alta o suficiente por um tempo suficiente.Você pode encontrar Este artigo esclarecedor.

Se for para fins profissionais e você tiver algum dinheiro para gastar, tente colocar a mão na massa JProfiler.Se você quiser apenas obter alguns insights, experimente o Plug-in do Eclipse Profiler.Usei várias vezes, mas não sei o estado atual.

Um novo (?) projeto do próprio projeto Eclipse também está disponível: http://www.eclipse.org/tptp/ (Ver Este artigo).Nunca usei, então não sei dizer se vale a pena o esforço.

Há também uma lista muito boa de criadores de perfil de código aberto disponíveis em http://www.manageability.org/blog/stuff/open-source-profilers-for-java

Analisador de latência de controle de missão JRockit.

O Latency Analyzer que vem com o JRockit mostra o que a JVM está “fazendo” quando não está fazendo nada.Na versão mais recente você pode ver latências para:

  • Java espera/bloqueado/suspenso/estacionado.
  • E/S de arquivo
  • E/S de rede
  • Alocação de memória
  • Pausas do GC
  • Latências da JVM, por exemplo, geração de código e carregamento de classe
  • Suspensão de rosca

A ferramenta fornecerá o rastreamento de pilha quando ocorreu a latência.Você pode visualizar os dados de latência de muitas maneiras diferentes (traços agregados, como um histograma, em um gráfico de threads, etc.).A ferramenta também permite ver transições entre threads, por exemplo, quando um thread notifica outro.

analisador de latência http://blogs.oracle.com/hirt/WindowsLiveWriter/The.0LatencyAnalyserMigratedfromtheoldBE_7246/latency_graph_2.png

A sobrecarga é insignificante e, diferentemente de muitas outras ferramentas, pode ser usada em um ambiente de produção.Esse postagem no blog fornece uma breve introdução e o programa pode ser baixado aqui.

É gratuito para uso no desenvolvimento!

Se o JConsole não puder ser usado, você pode

  • imprensa CTRL+QUEBRAR no Windows
  • enviar kill -3 <process id> no Linux

para obter um Thread Dump completo.Isso não afeta o desempenho e sempre pode ser executado em produção.

Use um criador de perfil. Sim, eles custam dinheiro e usá-los ocasionalmente pode ser um pouco estranho, mas fornecem muito mais evidências reais do que suposições.

Os seres humanos são universalmente ruins em adivinhar onde estão os gargalos de desempenho.Parece ser algo que nossos cérebros não foram construídos para fazer muito bem.Pode parecer óbvio, você pode ter ótimas ideias sobre qual é o problema, mas o mundo real muitas vezes acaba fazendo algo diferente.E otimizar a parte errada do código significa, na melhor das hipóteses, muito trabalho com benefício mínimo.Na maioria das vezes, torna as coisas mais lentas e, às vezes, quebra completamente as coisas.Portanto, antes de fazer qualquer alteração para fins de otimização, você deve sempre tenha evidências reais de um criador de perfil ou outra ferramenta precisa.

Conforme mencionado, tanto o JProfiler quanto o YourKit são bastante bons e não são proibitivamente caros.A última vez que olhei, ambos tinham demonstrações gratuitas também.

Para completar:mesmo que minha empresa padronize mais ou menos o Eclipse, usamos o Netbeans (6 e superior) com seu incluído, criador de perfil gratuito diariamente.Ele funciona melhor que o plugin Eclipse TPTP (última verificação há 3 meses) e para nós elimina qualquer necessidade de um criador de perfil comercial como o JProfiler, que é excelente, mas rapidamente se torna desnecessário.

VisualVM deve ser o criador de perfil do netbeans autônomo.Eu tentei o TPTP para Eclipse, mas o visualVm parece uma opção muito melhor!

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