Durante o uso do software Java, os problemas estranhos às vezes surgem inexplicavelmente. Esses problemas geralmente não podem ser localizados usando informações de log. Neste momento, precisamos analisar o problema verificando o relacionamento de pilha de threads dentro do processo.
Por exemplo, quando estamos fazendo uma operação, várias caixas de aviso aparecem inexplicavelmente, algumas das quais são normais e outras não. Para essas mensagens de aviso de erro, como devemos localizar o código em que local possui uma caixa pop-up de erro? Precisamos visualizar os vários threads do software após a caixa pop-up e descobrir qual tópico está causando o problema. Mas, às vezes, devido ao meio ambiente, tempo e outros problemas, não podemos usar o IDE para depurar. Só podemos tirar um instantâneo de memória através do software da ferramenta e analisar as informações da memória.
Hoje eu apresento uma ferramenta comumente usada: jstack
O JSTACK é uma ferramenta que vem com o JDK e também é um software com uma taxa de aparência muito alta no ajuste da JVM Performance. Portanto, é muito necessário dominá -lo.
O JSTACK pode gerar instantâneos de threads do ponto atual no tempo da JVM.
Um instantâneo de thread é uma coleção de pilhas de método que cada thread na JVM atual está executando. Os principais motivos para gerar instantâneos de threads:
1. O motivo das pausas de longo prazo dos threads através de instantâneos de threads, como impasse entre fios, loops mortos e espera a longo prazo causada pela solicitação de recursos externos.
2. Determine a fonte de informações de exceção através da análise de instantâneos do thread do relacionamento de chamada do método de execução atual.
É muito simples de usar:
(PS: A premissa é que você já tem um JDK com JSTack. É melhor ter o conjunto de variáveis do ambiente.)
Etapa 1: Veja o PID do processo através do Windows Task Manager
Aqui falo brevemente sobre o que é o PID: PID é a identidade de cada processo. É uma identidade única atribuída pelo sistema operacional para identificar a identidade do processo após o início do software.
Como mostrado
Na guia Processo, Exibir> Selecionar coluna
Verifique o PID e confirme
Alterne para a guia Aplicativo e selecione o programa para a memória instantânea. A imagem selecionada é o Android Studio. Clique com o botão direito do mouse para processar.
Aqui podemos ver que o PID correspondente do Android Studio é 9952
O segundo passo é abrir a linha de comando e executar o programa JSTack
Observe que, se a variável de ambiente não for adicionada com sucesso, ela só poderá ser executada no caminho do JSTack, caso contrário, o sistema operacional não o reconhecerá.
Como mostrado na figura, geralmente existem dois parâmetros operacionais aqui, que são usados para tirar instantâneos de memória.
Seus significados são os seguintes:
-L LONGAS LISTAÇÕES imprimirão informações adicionais de bloqueio. Quando ocorre um impasse, você pode usar o jstack -l pid para observar a situação de retenção de bloqueio
-m Modo misto, não apenas produz informações de pilha Java, mas também produz informações da pilha C/C ++ (como o método nativo)
Geralmente usamos o parâmetro -l para atender às necessidades
O formato é o seguinte jstack -l pid >> 123.txt
PS NOTA AQUI >> significa redirecionamento, o que significa emitir os instantâneos capturados para 987.txt. >> é melhor manter espaços quando as duas vezes
Dessa forma, geraremos um arquivo 987.txt no caminho da linha de comando e gravaremos o instantâneo da memória neste texto ao mesmo tempo.
Como mostrado na figura abaixo: