Exercício 1.3: Analisando Candidatos à Fuga
Antes de começar, você deve concluir o Exercício 1.2: Capturando Dumps de Heap.
Neste exercício, primeiramente você irá gerar uma lista de objetos (como por exemplo matrizes, vetores e sessões) que aparentam estar com fuga. Esses são os "candidatos à fuga". Em seguida, você analisará a lista para identificar quaisquer fugas.
Gerando uma Lista de Candidatos à Fuga
Para gerar a lista:
- Seguindo as instruções na visualização Candidatos à Fuga, clique no botão da barra de ferramentas Analisar por Fugas
. A caixa de diálogo Selecionar Opções de Análise de Fuga é aberta.
- Na caixa de diálogo, certifique-se de que as caixas de opções dos dois dumps de heap estejam marcadas.
Nota: O valor do Limite é definido por padrão em 20. Isto significa que apenas os candidatos à fuga com um valor de Probabilidade de 20 ou maior são exibidos. (Informações adicionais sobre os valores de Probabilidade são fornecidos posteriormente neste Exercício.)
- Clique em OK para gerar a lista. O indicador no canto inferior direito da Software Development Platform relata que está localizando candidatos à fuga.
Uma Visão Geral da Visualização Candidatos à Fuga
Quando o processo for concluído, a visualização Candidatos à Fuga exibirá uma lista dos candidatos à fuga.
Cada candidato possui um valor de probabilidade entre 100 e 1, com o candidato mais provável possuindo o valor de 100. Os outros candidatos são posicionados de acordo e listados em ordem de probabilidade decrescente.
(O algoritmo de comparação de heap calcula os valores de probabilidade com base no tamanho da fuga e em seu crescimento durante o intervalo entre os dois dumps de heap.)
O valor de Limite foi definido em 20 para essa execução de criação de perfil; quaisquer candidatos com um valor de Probabilidade 19 ou menor não serão exibidos.
A visualização fornece os seguintes dados para cada candidato à fuga:
- Raiz da fuga. Este é o objeto raiz de nível superior que está suspendendo referências para os objetos potencialmente com fuga.
- Tipo do contêiner. Este é o objeto de coleta que está mantendo os objetos com fuga. As fugas ocorrem mais provavelmente em objetos de coleção, como vetores e listas.
- O que está em fuga. Este é o tipo dos objetos com fuga.
- Número de fugas. Este valor representa a quantidade de objetos do tipo especificado na coluna "O que está com fuga" que estão no objeto do contêiner. Esses objetos podem, por sua vez, fazer referência a outros objetos. As colunas "Objetos com fuga" e "Bytes em fuga" incluem esses objetos referenciados.
- Bytes em fuga.
- Objetos com fuga.
Analisando e Identificando a Fuga
Para identificar a fuga:
- Na visualização Candidatos à Fuga, olhe os dados do candidato à fuga que possui uma probabilidade 100:
- A raiz da fuga é TestThreeTierQueue.<ObjectID>
- O tipo do contêiner é vector.
- O vetor está com fuga de cadeias. Em outras palavras, o vetor está mantendo referências a cadeias que, julgando pelo número de fugas e o número de bytes com fuga, deveria estar liberando para que a coleta de lixo possa liberar a memória. (O número de fugas e o número de bytes com fuga provavelmente será diferente cada vez que o programa for executado, dependendo do momento dos dumps de heap capturados.)
- Dê um clique duplo no candidato à fuga. A visualização Gráfico de Referência do Objeto é aberta e exibe dados gráficos para o candidato à fuga. (Note que pode levar algum tempo para preparar o dump de heap para exibição.)
- Examine o gráfico de referência do objeto. Note os seguintes pontos:
- O gráfico realça os objetos que estão conectados, por referências, à fuga em potencial: a raiz da fuga, seguindo até SecondaryQueue, para o vetor e, finalmente, para o conjunto de cadeias com fuga. Isso fornece uma imagem visual do que está em fuga.
- No gráfico, há uma matriz Object que é referenciada por um Vector (o tipo do contêiner envolvido na fuga) e a matriz Object faz referência aos objetos String com fuga.
- Pause o cursor sobre o caminho que conecta a matriz Object e String e leia a dica de ferramenta exibida: Ela mostra uma "Contagem" igual ao Número de Fugas exibido na visualização Candidatos à Fuga e, portanto, esta é a coleção de cadeias que foi identificada como a fuga.
- No gráfico de referência do objeto, dê um clique duplo no objeto Cadeia. A visualização Detalhes do Objeto é aberta. Ela exibe todos os detalhes do objeto String, incluindo todos os objetos que fazem referência a ele e todos os objetos aos quais ele, por sua vez, se refere. Note que, na visualização Detalhes do Objeto, é possível navegar até os referenciadores clicando em um deles ou para baixo nos referenciados (objetos aos quais o objeto se refere) clicando em um deles.
O que você descobriu? Agora você sabe que a Fila Secundária é o objeto com fuga e que isso acontece porque um objeto Vector está retendo referências a muitos objetos String.
Agora você está pronto para começar o Exercício 1.4: Corrigindo a Fuga de Memória.