Os despejos de threads podem nos ajudar a determinar picos de CPU, impasse, exceções de memória, resposta lenta do aplicativo, tempo de resposta longo e outros problemas do sistema. Algumas ferramentas de análise on -line como http://fastthread.io/ também podem nos ajudar a analisar e localizar problemas, mas essas ferramentas exigem um arquivo de despejo. Portanto, neste artigo, resumi as maneiras de pegar os arquivos Java Thread depostos em 7.
1. Jstack
O JSTACK é uma ferramenta eficaz da linha de comando para rastrear arquivos de despejo de threads. Está localizado na pasta BIN (JDK_HOME/BIN) no diretório JDK. A seguir, é apresentado o comando para rastejar arquivos de despejo:
jstack -l <pid>> <File -Path>
ilustrar:
PID: o ID do processo do aplicativo Java, ou seja, o ID do processo de aplicação que precisa rastejar o arquivo de despejo.
Path de arquivo: o caminho para salvar o arquivo de despejo.
Exemplo:
jstack -l 37320> /opt/tmp/threaddump.txt
O exemplo acima demonstra o uso do jstack para gerar arquivos de despejo no diretório /opt/tmp/threaddump.txt.
A partir do Java5, o JStack foi incluído no JDK. Se você usar a versão antiga do JDK, considere usar outros métodos.
2. Mate -3
Em termos de considerações de segurança, algumas máquinas em ambientes de produção contêm apenas ambientes JRE, para que a ferramenta JSTack não possa ser usada. Nesse caso, podemos usar o Kill -3:
kill -3 <pid>
ilustrar:
PID: o ID do processo do aplicativo Java, ou seja, o ID do processo de aplicação que precisa rastejar o arquivo de despejo.
Exemplo:
kill -3 37320
Ao usar o Kill -3 para gerar arquivos de despejo, os arquivos de despejo são emitidos para o fluxo de erro padrão. Se o seu aplicativo estiver em execução no Tomcat, o conteúdo do despejo será enviado ao arquivo <omcat_home> /logs/catalina.out.
3. JVisualvm
O Java VisualVM é uma ferramenta de interface gráfica que pode fornecer informações de JVM. Está localizado no arquivo JDK_HOME/BIN/JVISUALVM.EXE. Começando com o JDK6 Update7, ele está incluído no JDK.
Execute o JVisualVM e, no painel esquerdo (como mostrado na figura abaixo), as informações JVM em execução estão listadas. Essa ferramenta pode pegar arquivos de despejo de JVMs em execução locais ou remotos.
Clique no botão de despejo de thread correspondente ao nome do processo na figura acima para gerar um arquivo de despejo, como mostrado na figura abaixo:
4. JMC
O Java Mission Control (JMC) é uma ferramenta que pode coletar e analisar dados de um ambiente local ou de produção. Começando com o Oracle JDK 7 Update 40, está incluído no JDK, que pode gerar arquivos de despejo a partir da JVM. JMC está localizado no arquivo jdk_home/bin/jmc.exe:
Depois de executar a ferramenta, você pode ver o processo Java em execução localmente, que também pode ser conectado a uma máquina remota. Clique duas vezes no processo Java que você deseja gerar o arquivo de despejo, clique em Flight Recorder e verá a seguinte caixa de diálogo:
Na caixa suspensa Dump Thump, você pode selecionar o intervalo de tempo para gerar o arquivo de despejo. No exemplo acima, um arquivo de despejo será gerado a cada 60 segundos. Depois de selecionar completar, inicie o gravador de vôo e você poderá ver o conteúdo do arquivo de despejo no painel Threads:
5. Windows (Ctrl + Break)
Este método é válido apenas em sistemas operacionais do Windows:
Selecione a linha de comando na janela do console
Pressione o comando "Ctrl + Break" na janela da linha de comando
Em seguida, um arquivo de despejo será gerado e o conteúdo do arquivo de despejo será impresso na janela da linha de comando.
NOTA 1: Existem vários notebooks (como a série Lenovo T) que cancelam a tecla "Break"; nesse caso, você deve pesquisar no Google para chaves que possuem funções semelhantes à chave de quebra, e descobri que a tecla "Função + B" é a mesma que a tecla de quebra, então usei a tecla "Ctrl + Fn + B" B "para gerar o arquivo.
Nota 2: Uma desvantagem de usar o método acima é que o conteúdo do arquivo de despejo será impresso no console. Se não houver arquivo de despejo, é difícil usar ferramentas de análise como http://fasthread.io para analisar o arquivo de despejo. Portanto, você pode usar o seguinte comando para emitir o conteúdo do arquivo de despejo para um arquivo de texto. Por exemplo, o nome do seu aplicativo é o sampleThreadprogram, portanto, os comandos usuais são os seguintes:
java -classpath . SampleThreadProgram
O comando para produzir o conteúdo do arquivo de despejo para um arquivo de texto é o seguinte:
java -classpath . SampleThreadProgram > C:/workspace/threadDump.txt 2>&1
Depois de pressionar a tecla "Ctrl + Break", o arquivo de despejo será salvo para c: /workspace/threaddump.txt.
6. ThreadMxBean
Começando com o JDK 1.5, o ThreadMxBean foi introduzido. Esta é a interface de gerenciamento da JVM. Usando essa interface, você só precisa de uma pequena quantidade de código para gerar arquivos de despejo. A seguir, é apresentada a principal implementação do uso do ThreadMxBean para gerar arquivos de despejo:
public void dumpthreadDump () {threadMxBean threadMxBean = ManagementFactory.getThreadMxBean (); para (ThreadInfo Ti: ThreadMxBean.DumpallThreads (true, true)) {System.out.print (ti.toString ()); }}7. Dinâmica do aplicativo da ferramenta APM
Algumas ferramentas de monitoramento de desempenho do aplicativo fornecem a função de gerar arquivos de despejo. Se você usar a dinâmica do aplicativo para monitorar seu aplicativo, a seguir, as etapas para gerar arquivos de despejo:
Abra a janela Criar ação e selecionar Diagnósticos-> Pegue um despejo de thread na janela Criar ação;
Digite o nome da ação, o número de arquivos de despejo a se arrastar e o intervalo de tempo (milissegundos) para rastrear arquivos de despejo;
Se você deseja executar algumas ações antes do início da ação de despejo de rastreamento, poderá selecionar a aprovação da execução antes desta caixa de seleção de ação e inserir o endereço de email do indivíduo ou grupo;
Clique em OK.
Resumir
Embora eu tenha listado 7 maneiras de pegar arquivos de despejo mais cedo, o IMHO, o JStack e o Kill -3 são as melhores opções pelos seguintes motivos:
um. Simples, fácil de implementar;
b. Geral: Na maioria dos casos, independentemente do tipo de sistema operacional, fornecedor de java, versão JVM, etc.