VisualVM é uma ferramenta que integra várias outras ferramentas de linha de comando da JDK(jconsole, jinfo, jstack…) já existentes. Com ele é possível monitorar e analisar suas aplicações Java através de relatórios e gráficos em tempo real.
O VisualVM é distribuído junto com a JDK partir da versão 6 – procure por “jvisualvm” dentro do seu JAVA_HOME/bin – e você pode também fazer o download da última versão no site oficial(https://visualvm.java.net/download.html).
Assim que o VisualVM é iniciado, ele encontra as JVM’s iniciadas na máquina local e as mostra no dock “Applications”. A partir deste menu é possível acessar as várias informações.
No exemplo abaixo, apenas iniciei o Tomcat, com o VisualVM já aberto, e ele já apareceu no dock.
Ainda no dock em “Remote” é possível registrar uma JVM em outro computador remoto. Basta para isso habilitar a porta JMX para a conexão.
Note que a aba “Overview” já traz algumas informações interessantes sobre a aplicação, como o número do processo, a classe principal de execução da aplicação, versão da JVM e seus argumentos.
Na aba “Monitor” temos os gráficos que são atualizados a cada segundo(o tempo pode ser configurado). Ainda a partir desta aba, podemos invocar um “Full Garbage Collection” através do botão “Perform GC” e também podemos fazer um “Heap Dump”, que gravará um snapshot em arquivo “.hprof” contendo várias informações do que havia na heap naquele momento. Útil quando você viu algo estranho e gostaria de manter o histórico daquela ocorrência para ser verificado.
Destaco aqui o gráfico da “Heap”, que mostra o que a aplicação está consumindo e o tamanho reservado. Este gráfico em particular pode ser bastante útil quando estamos tentando ajustar os argumentos da JVM relacionados ao uso de memória.
Em “Profiler”, temos uma poderosa ferramenta onde podemos analisar o desempenho da aplicação em relação à CPU e memória(botões “CPU” e “Memory” respectivamente). No exemplo abaixo, o VisualVM está fazendo o profiling analisando o uso da CPU. Perceba em “Profiling results” – atualizado automaticamente – o tempo que cada método levou para ser executado e a quantidade das invocações.
Ainda em “Profiling results” é possível resetar os resultados, criar snapshots, salvar e exportar os resultados.
Mas e a aba “Sampler”?
Em “Sampler” também podemos analisar o desempenho da aplicação em relação ao uso da CPU e memória.
Apesar do objetivo ser basicamente o mesmo de profiling, há diferenças importantes à se saber:
Sampler – funciona pegando vários thread dumps e analisando stack traces da execução. É mais rápido, porém menos preciso, uma vez que não exige alterações em runtime no seu bytecode (o que poderia ser um risco para a aplicação).
Profiler – executando o profiling, suas classes e métodos serão “instrumentas” para que os mesmos se reportem sempre quando forem invocados. É mais preciso, uma vez que o método sempre reporta quando é invocado e não apenas quando um dump é feito. Porém, isso significa que os bytecodes de suas classes serão modificados, o que pode afetar(mesmo “quebrar”) a execução da sua aplicação.
Todas as threads podem ser visualizadas na aba “Threads”. Aqui você pode ver os estados das threads, e em “Details” ainda pode conferir o tempo em que determinada thread está executando.
Quer mais do VisualVM? Entre no menu superior “Tools” e “Plugins” para mais algumas ferramentas interessantes. Veja o visualizador do Garbage Collector que instalei.
O visualizador mostra o consumos das etapas na estrutura da heap e também gráficos em tempo real.
Com esta quantidade razoável de informações e ferramentas para análise, podemos tirar muito proveito do VisualVM para analisarmos a performance de nossas aplicações Java.
Na segunda parte deste assunto, vamos demonstrar o uso do VisualVM e tentar identificar alguns problemas com algumas aplicações de exemplo. Então, fique ligado! 😉