Início > Análise > Extração do Stack Trace de Processos Java com Jstack

Extração do Stack Trace de Processos Java com Jstack

O VisualVM é uma interface gráfica que fornece informações detalhadas sobre aplicações Java rodando na Java Virtual Machine (JVM). Ele é uma combinação de várias ferramentas para monitoração, profiling e troubleshooting (resolução de problemas) em JVMs locais ou remotas.

O VisualVM é uma alternativa gratuita – e sempre à mão – ao JProfiler. Particularmente, acho o JProfiler imbatível. Utilizei o VisualVM várias vezes para e extrair dumps de memória e de threads em ambientes totalmente isolados rodando aplicações desktop. Isso era possível porque havia ambiente gráfico.

Uma interface gráfica não é necessária em servidores de aplicação. Essa é uma boa prática de otimização: manter apenas os processos necessários de acordo com a finalidade do host. Porém, isso era um problema, pois eu precisava fazer dump das threads para analisar uma situação que ocorria em uma ambiente isolado e sem interface gráfica.

Descobri que uma das ferramentas agregadas ao VisualVM e que vem junto com o JSE, o jstack, pode ser executada em linha de comando. Eu prefiro linha de comando por causa do controle e da flexibilidade que um shell oferece.

Conhecendo o ID do processo (PID), basta rodar o jstack. Esse exemplo mostra a saída da execução do jstack para um processo cujo ID é 8321:

$ jstack 8321
Attaching to process ID 8321, please wait...
Debugger attached successfully.
Client compiler detected.
JVM version is 1.6.0-rc-b100
Deadlock Detection:

Found one Java-level deadlock:
=============================

"Thread2":
  waiting to lock Monitor@0x000af398 (Object@0xf819aa10, a java/lang/String),
  which is held by "Thread1"
"Thread1":
  waiting to lock Monitor@0x000af400 (Object@0xf819aa48, a java/lang/String),
  which is held by "Thread2"

Found a total of 1 deadlock.

Thread t@2: (state = BLOCKED)

Thread t@11: (state = BLOCKED)
 - Deadlock$DeadlockMakerThread.run() @bci=108, line=32 (Interpreted frame)

Thread t@10: (state = BLOCKED)
 - Deadlock$DeadlockMakerThread.run() @bci=108, line=32 (Interpreted frame)

Thread t@6: (state = BLOCKED)

Thread t@5: (state = BLOCKED)
 - java.lang.Object.wait(long) @bci=-1107318896 (Interpreted frame)
 - java.lang.Object.wait(long) @bci=0 (Interpreted frame)
 - java.lang.ref.ReferenceQueue.remove(long) @bci=44, line=116 (Interpreted frame)
 - java.lang.ref.ReferenceQueue.remove() @bci=2, line=132 (Interpreted frame)
 - java.lang.ref.Finalizer$FinalizerThread.run() @bci=3, line=159 (Interpreted frame)

Thread t@4: (state = BLOCKED)
 - java.lang.Object.wait(long) @bci=0 (Interpreted frame)
 - java.lang.Object.wait(long) @bci=0 (Interpreted frame)
 - java.lang.Object.wait() @bci=2, line=485 (Interpreted frame)
 - java.lang.ref.Reference$ReferenceHandler.run() @bci=46, line=116 (Interpreted frame)
Anúncios
  1. Nenhum comentário ainda.
  1. No trackbacks yet.

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: