Se você tem um aplicativo Java que está consumindo CPU quando não está fazendo nada, como você determina o que está fazendo?

Estou chamando a API Java de um fornecedor e, em alguns servidores, parece que a JVM entra em um loop de sondagem de baixa prioridade depois de efetuar login na API (CPU com 100% de uso). O mesmo aplicativo em outros servidores não exibe esse comportamento. Isso acontece no WebSphere e no Tomcat. O ambiente é difícil de configurar, então é difícil tentar fazer algo como criar um perfil no Eclipse.

Existe uma maneira de criar um 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 spinwait? O aplicativo está executando apenas um método quando fica nesse estado (método do fornecedor). O fornecedor não pode replicar o comportamento (claro).

Atualizar:

Usando o JConsole, consegui determinar quem estava correndo e o que eles estavam fazendo. Levei algumas horas para descobrir por que estava fazendo isso. O problema acabou sendo que o jar de API do fornecedor que estava sendo usado não correspondia exatamente à configuração do banco de dados que ele estava usando. Era o padrão ter o rastreamento e o monitoramento de desempenho habilitados nos servidores que apresentavam uma ligeira incompatibilidade na configuração. Eu usei um frasco 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 - Eu fiz algumas experiências com algumas das opções que você sugeriu. Eu tive alguns problemas com a configuração do JProfiler, parece bom (mas caro). Indo adiante, fui em frente e adicionei o plugin Eclipse Profiler e estarei examinando os diferentes profilers de código aberto para comparar a funcionalidade.

questionAnswers(8)

yourAnswerToTheQuestion