sábado, 18 de junho de 2011

Algumas ferramentas da JDK

Algumas pessoas veem me perguntar às vezes quais ferramentas usar para diagnosticar uma aplicação que não está se comportando como deveria. Na maioria das vezes é possível diagnosticar uma aplicação em execução apenas com as ferramentas que vem junto com a JDK mas que muitas pessoas desconhecem mas que (na minha opinião) todos deveríamos conhecer. A maioria das ferramentas abaixo está presente tanto na JDK5 quanto na JDK6 e a maioria delas precisa ser executada com o mesmo usuário que executa o processo. Por último, os comandos abaixo são da versão solaris da JDK e podem ter alguma diferença se executadas em outros sistemas operacionais.

JPS
Parecida com o ps dos UNIX'es, mas lista apenas os processos java em execução, mostrando o pid (o process id) e o nome da classe main que iniciou o processo. Com a opção '-v', mostra toda a linha de comando usada para iniciar o processo e com a opção '-l' mostra o nome completo da classe main.

JSTACK
Uma vez identificado o pid da aplicação, precisamo ver o que acontece com ela. O comando jstack mostra na tela um stacktrace de todas as threads da aplicação e verifica se há algum deadlock entre as threads. Além disso, é possível identificar se alguma thread está parada em algum ponto ou esperando por I/O.

JINFO
jinfo mostra todas as sytem properties e todas as flags da jvm.

JMAP
jmap mostra todas as bibliotecas ligadas à sua aplicação, bem como o offset de memória em que estão mapeadas. Esta informação não é tão útil a menos que estejamos tentando identificar a causa de um crash da jvm. Normalmente usaremos jmap -heap para ver o estado da memória separado por região incluindo o permgen. Caso um problema de memória seja identificado, é possível gerar um histograma com os contadores de todos as instâncias dos objetos vivos com a flag -histo ou ainda gerar o heap dump com a flag -dump:.

JCONSOLE
Se tudo mais falhar, é possível tentar usar uma ferramenta gráfica chamada jconsole que se conecta à um processo java e consegue ver todas as informações anteriores e ainda inspecionar objetos expostos via JMX.

Como pudemos ver, é possível obter várias informações sobre uma aplicação em execução (e possivelmente diagnosticar problemas) apenas usando as ferramentas que vem junto com a JDK.