Como ckhan mencionou, jstack
é ótimo porque fornece o rastreamento completo da pilha de todos os encadeamentos ativos na JVM. O mesmo pode ser obtido no stderr da JVM usando o SIGQUIT.
Outra ferramenta útil é jmap
, que pode capturar um dump de heap do processo da JVM usando o PID do processo:
jmap -dump:file=/tmp/heap.hprof $PID
Esse dump de heap pode ser carregado em ferramentas como visualvm
(que agora faz parte da instalação padrão do Oracle java sdk, chamada jvisualvm). Além disso, o VisualVM pode se conectar à JVM em execução e exibir informações sobre a JVM, incluindo a exibição de gráficos de uso interno da CPU, contagens de encadeamentos e uso de heap - ótimo para rastrear vazamentos.
Outra ferramenta, jstat
, pode coletar estatísticas de coleta de lixo para a JVM por um período de tempo muito parecido com o vmstat quando executado com um argumento numérico (por exemplo, vmstat 3
).
Finalmente, é possível usar um agente Java para enviar instrumentação em todos os métodos de todos os objetos no momento da carga. A biblioteca javassist
pode ajudar a tornar isso muito fácil de fazer. Então, é possível adicionar seu próprio rastreamento. A parte difícil com isso seria encontrar uma maneira de obter saída de rastreio somente quando você desejasse e não o tempo todo, o que provavelmente atrasaria o rastreamento da JVM. Existe um programa chamado dtrace
que funciona de uma maneira como essa. Eu tentei, mas não foi muito bem sucedido. Observe que os agentes não podem instrumentar todas as classes porque as necessárias para autoinicializar a JVM são carregadas antes que o agente possa instrumentar e, então, é muito tarde para incluir instrumentação nessas classes.
My Suggestion - comece com o VisualVM e veja se isso indica o que você precisa saber, pois ele pode mostrar os threads atuais e as estatísticas importantes da JVM.