fbpx
+55 (11) 4506-3239

1 mar 2011

IBM HeapAnalyzer

//
Comments4

Problemas de java core e dumps em ambientes WebSphere Application Server são bem comuns.
Isso deve-se pois o WebSphere Application Server roda em cima de uma JDK devido produto ser interpretado, diferente de outros produtos que são executados.
Os problemas apresentados são os mais diversos tanto com o próprio WebSphere Application quanto das aplicações que estão rodando no ambiente.
Problemas do produto logo são detectados e lançados fixpacks ou ifix de correção. Porém, quando se trata de aplicações é onde mora o maior problema.
O administrador por sua vez deve ter a habilidade de detectar o problema, investigar e dizer onde se encontra. É comum colocar a culpa no produto, mas em sua grande maioria o problema está na aplicação de terceiro. Neste post, vou mostrar como o administrador pode identificar e analisar um heapdump.

Out of Memory
Este é um dos problemas mais comuns que ocorrem. Um Out of memory ocorre devido a falta de memória principal onde os objetos não podem ser mais alocados para uso no sistema operacional. No caso do WebSphere o problema ocorre pois o máximo size de java alocado ultrapassou o limite. Neste caso o garbage collection não conseguiu limpar os objetos desalocados que não mais estão sendo utilizados na memória gerando um IBM java heapdum.

IBM Java heapdump
IBM Java virtual machine gera um dump de todos os objetos alocados (vivos) que estão em um Java heap, ou seja, aqueles objetos que estão sendo utilizados pelo aplicativo Java. Esse descarregamento é chamado de IBM Java heap dump. Ele exibe os objetos que estão utilizando espaço de memória em um Java heap.

O javacore e heapdump se localizam na profile do servidor. was_profile.

São dois arquivos gerados: javacore e dump.

Javacore: Possui a extensão .txt e sua estrutura é definida como:

Cabeçalho

Exibe a identificação do dump com sua versão e sistema operacional.

Corpo

Endereço do objeto
Tamanho dos objetos
Nome do objeto
As referências de objetos

Dump: Possui a extensão .phd. Seu tamanho é referente ao tamanho especificado no Maximum heap size no WAS.

O Java heap dump é gerado automaticamente quando existe a exaustão de uso da JVM.

Formato do arquivo Heap dump.

Windows: heapdump.YYYYMMDD.HHMMSS.PID.txt
Linux e AIX: heapdumpPID.TIME.txt
z/OS: HEAPDUMP.YYYYMMDD.HHMMSS.PID.txt

Nota: PID é o número do processo Java.

Verificando a fragmentação de objetos
Muitos problemas de Out of memory estão relacionados a falha na fragmentação de objetos mesmo possuindo espaço suficiente na JVM. Isso ocorre porque a JVM não consegue encontrar espaço contíguos no heap para alocar objetos. A solução é agrupar objetos que podem ser movidos em grupos para que eles não fragmentem um Java heap.

A partir da versão JDK 1.4.2 já é possível ajustar o tamanho destes objetos com a opção -Xk.

Para verificar o tamanho necessário, execute o comando java -jar ClassCount.jar

A saída do comando ficará da seguinte forma: set -Xk to 15528 or greater.

Ajuste esse parâmetro no Generic JVM Arguments
Application servers > server1 > Process Definition > Java Virtual Machine > Generic JVM arguments > -Xk15528

Se o problema for de fragmentação, essa pode ser a solução. Ative o “Verbose garbage collection” e acompanhe como está o uso da JVM. Caso ainda continue a gerar heap, será necessário uma análise mais detalhada no arquivo .phd.

Analisando um heapdump
Para analisar um heapdump, a ferramenta a ser utilizada é a IBM HeapAnalyzer.
Com essa ferramenta é possível carregar um arquivo phd sendo possível visualizar todos os seus objetos.

Requisitos
Java 1.5 ou 1.6

Para carregar a ferramenta execute o comando java -jar -Xmx1000m ha413.jar.

Caso receba a mensagem “java.lang.OutOfMemoryError“, aumente o tamanho do valor do heap size -Xmx.

1 – Após iniciar a ferramenta, clique em “File > Open
2 – Procure pelo arquivo .phd.
3 – Após carregar o dump, será exibido tres janelas.
3.1 – A primeira janela mostra as propriedades do arquivo como a versão do Java, número de classes,    objetos, arrays, etc.
3.2 – Na segunda janela logo abaixo estão as referências de todos os objetos, sendo pai e filho.
3.3 – Ao lado, está a propriedade de cada objeto.

O objetivo é procurar por leaks (vazamentos) que possam estar causando o estouro de JVM. Veja que logo ao carregar o dump, já é exibido o número de leaks existentes no arquivo phd.

Para encontrar qual objeto está com leak, clique com o botão direito no objeto root e clique em “Locate a leak suspect” Neste caso o leak está em uma array que pode ser identificado pela cor amarela.

Os ícones são identificados como C = Classe, I = Instância, [] = Array
Ao lado é possível verificar que a quantidade de objetos filhos é exagerada para apenas um objeto pai.
Neste caso é possível identificar que o problema de dump está ocorrendo com uma aplicação chamada “Consulta_Chegada“. Verifique o número de objetos com o mesmo tipo clicando com o botão direito no objeto 0x212e6f70 (Este é o objeto que está com leak).
Veja que a quantidade de objetos deste endereço 0x212e6f70 é extremamente maior que a dos outros objetos do mesmo tipo, neste caso array.

Aqui podemos identificar que o problema está com a aplicação “Consulta_Chegada” e não um bug no WebSphere. O ideal neste caso é revisar o código da aplicação e testar o seu funcionamento antes de aplicar em um ambiente de produção.
Não é possível detectar todos os problemas apenas utilizando o IBM HeapAnalyzer pois a análise é feita em um estado de tempo do dump. Um diagnóstico completo envolve outras ferramentas como IBM Pattern Modeling and Analysis Tool e IBM Thread and Monitor Dump Analyzer for Java em conjunto com traces e logs.
Em outros posts vou falar sobre estas duas ferramentas.
Para baixar o IBM HeapAnalyzer, clique aqui
Enjoy

4 Responses