Jmap e jstack para iniciantes

Jmap e jstack para iniciantes
JMAP e JSTACK são provavelmente os utilitários mais valiosos na caixa de ferramentas de qualquer desenvolvedor Java. Com a funcionalidade de ambas as ferramentas combinadas, você pode depurar problemas e executar diagnósticos para o programa Java que você está codificando. Como o par mais fundamental de ferramentas de depuração, é essencial que você saiba trabalhar com eles.

Este vai ser um tutorial sobre o JMAP e o Jstack Utilities em Java para iniciantes. Quando terminar este tutorial, você terá uma idéia melhor sobre como essas duas ferramentas podem ajudá -lo com a solução de problemas e a depuração.

Executando diagnósticos com jstack

Jstack, em essência, é um utilitário de linha de comando usado na solução de problemas. Com o JSTack, você pode ter os dumps de threads para programas, processos ou arquivos de núcleo java específicos para identificar os problemas. Isso, por sua vez, revela mais detalhes, como o nome completo da classe, o nome do método, o número da linha do elemento e o índice de bytecode. Jstack permite que você veja qual ação cada linha de código está tomando quando você executa o programa.

Executar diagnóstico é o que o utilitário jstack é mais comumente usado para. Você aplica o comando jstack a um arquivo/ processo principal específico e ele reporta todos os threads vinculados à JVM (threads internos da VM incluídos), bem como os quadros de pilha original. Além disso, o JSTack também pode identificar sobreposições de uso de recursos (deadlocks) para solucionar problemas do programa. Esses recursos permitem que os usuários eliminem a necessidade de confiar em qualquer outro utilitário para realizar um diagnóstico completo para acabar com quaisquer bugs ou erros no programa.

Dirigindo um depósito de pilha

Se um programa não responder ou se um processo estiver preso, você poderá identificar a raiz exata do problema executando um despejo de pilha. É especialmente útil quando o JSTack ProcessId também não responde, para que você possa usar a mudança -f para sua vantagem.

Um despejo típico de pilha deve se parecer com o conteúdo abaixo:

Recuperar traços de despejos principais

Se você não está familiarizado com os principais depósitos, são depostos de memória que mantêm um log para arquivos ou programas, documentando seu conteúdo e estado em um determinado momento, normalmente quando um problema sofre uma falha sem precedentes. Os dumps principais são bastante flexíveis em termos do conteúdo que eles podem manter: e podem ser muito detalhados para aplicativos específicos.

Para extrair os traços de pilha de um dump do núcleo, digite o comando abaixo:

$ Jstack $ java_home/bin/java core

Pilha mista

Muitas vezes você se depara com erros grandes demais para serem identificados apenas com pilhas java. É aqui que você precisará puxar os quadros de pilha nativa e ver aqueles com as pilhas Java. Os quadros nativos são gerados usando a linguagem C/C ++, e estes podem ser um salva -vidas quando se trata de executar diagnósticos.

Para imprimir as pilhas nativas, use o comando -m como ilustrado abaixo:


Identificando vazamentos com o JMAP Utility

Como um desenvolvedor de java iniciantes (vou assumir que você ainda é um novato, por que mais você estaria em um tutorial do JMAP?), você estará executando diagnósticos com muito mais frequência do que você pode imaginar. Os problemas podem assumir a forma de desordem de memória, manifestando -se como um monte de acumulação continuamente que não desaparece tão fácil, ou talvez como um atraso na liberação de um Arraylist.

Para equilibrar essas compensações, você estará identificando esses vazamentos antes de trabalhar para corrigi -los. A ferramenta mais poderosa que você tem à sua disposição nesse sentido é o utilitário jmap. O utilitário jmap alivia o problema registrando o tamanho e o status da pilha acumulada.

É assim que você usará o comando jmap ao escolher os vazamentos.

-Comando heap

O comando -heap revela informações sobre a pilha em detalhes. Por exemplo, você pode adquirir informações sobre os algoritmos GC, aprimorando detalhes sobre cada tópico envolvido em qualquer um de seus processos. Você também pode ver os relatórios de uso de heap e em alguns detalhes excelentes também. O JMAP revelará informações sobre a capacidade de calor e a memória atualmente disponível quando solicitado a gerar relatórios de heap.

Histograma de pilha

Para visualizar melhor os relatórios que o JMAP apresentou, um histograma pode ser criado. Para esse fim, você tem a opção -histo que imprime o histograma para um arquivo principal do processador Java. Quando aplicado a um processo em execução, você verá o tamanho da memória em bytes, quantos objetos os ocupam, com seus nomes de classe.

$ Jmap -histo \/java/re/javase/6/mais recente/binários/solaris -sparc/bin/java core.27421

Antes de encerrarmos:

Precisamos falar sobre Estatística de geração permanente. Em Java, a geração permanente faz parte da pilha que contém toda a questão da máquina virtual. Entre outras coisas, contém detalhes sobre o método e os objetos de classe. Esses detalhes incluem o número exato de classes, número de bytes em serviço para cada carregador de classe, endereço do carregador de classe, bem como o endereço do carregador de classe pai e uma indicação de se o programa será mantido ou enviado ao lixo coleção mais tarde.

Resumindo

Agora que você sabe como usar o JSTack e o JMAP, você tem duas das ferramentas de solução de problemas mais importantes à sua disposição. Este tutorial ilustrou como você pode identificar as raízes de diferentes problemas em seu programa, revelando as pilhas e threads nativos. Também discutimos como consertar vazamentos de pilha com JMAP.

É isso para esta lição. Até a próxima vez.