Analisar o uso de memória usando a ferramenta de Alocação de Objeto do .NET
Você pode ver quanta memória seu aplicativo usa e quais caminhos de código alocam mais memória usando a ferramenta de Alocação de Objeto do .NET.
Depois de executar a ferramenta, você pode ver os caminhos de execução da função em que os objetos estão sendo alocados. Em seguida, você pode rastrear de volta até a raiz da árvore de chamadas que está ocupando a maior parte da memória.
Para obter um tutorial que demonstra como melhorar o desempenho ao usar a ferramenta Alocação de Objeto .NET, consulte Estudo de caso: Guia para iniciantes sobre como otimizar o código.
Instalação
Selecione Alt+F2 para abrir o Criador de Perfil de Desempenho no Visual Studio.
Marque a caixa de seleção Acompanhamento de Alocação de Objeto do .NET.
Selecione o botão Iniciar para executar a ferramenta.
Se você habilitar a opção Iniciar com a coleção pausada antes de iniciar o criador de perfil, os dados não serão coletados até que você selecione o botão Gravar no modo de exibição de sessão de diagnóstico.
Depois que a ferramenta começar a ser executada, percorra o cenário cujo perfil você deseja criar em seu aplicativo. Em seguida, selecione Parar coleta ou feche seu aplicativo para ver seus dados.
Selecione a guia Alocação. Dados de alocação de memória semelhantes aos seguintes são exibidos.
Agora você pode analisar a alocação de memória dos objetos.
Durante a coleta, a ferramenta de acompanhamento pode reduzir a velocidade do aplicativo com perfil. Se o desempenho da ferramenta de acompanhamento ou do aplicativo estiver lento e se você não precisar rastrear todos os objetos, poderá ajustar a taxa de amostragem. Para fazer isso, selecione o símbolo de engrenagem ao lado da ferramenta de acompanhamento na página de resumo do criador de perfil.
Ajuste a taxa de amostragem para a taxa desejada. Essa alteração ajuda a acelerar o desempenho do seu aplicativo durante a coleta e a análise.
Para obter mais informações sobre como tornar a ferramenta mais eficiente, confira Otimizar as configurações do Criador de Perfil.
Entender seus dados
Na exibição gráfica anterior, o grafo superior mostra o número de objetos dinâmicos em seu aplicativo. O grafo inferior Delta do objeto mostra a alteração percentual de objetos de aplicativo. Barras vermelhas indicam quando a coleta de lixo ocorreu.
Você pode filtrar os dados tabulares para exibir a atividade apenas para um intervalo de tempo especificado selecionando um intervalo de tempo. Quando você faz isso, as informações exibidas nas guias têm como escopo o intervalo de tempo filtrado.
Você também pode ampliar ou reduzir o grafo.
Alocação
A exibição Alocação mostra o local dos objetos que estão alocando memória e quanta memória esses objetos estão alocando.
As seguintes informações aparecem na exibição Alocação:
A coluna Tipo é uma lista de classes e estruturas que ocupam memória. Clique duas vezes em um tipo para exibir o backtrace dele como uma árvore de chamadas invertida. Somente na exibição Alocação, você pode ver itens dentro da categoria selecionada que ocuparão memória.
A coluna Alocações mostra o número de objetos que assumem a memória em uma determinada função ou tipo de alocação. Essa coluna aparece somente nas exibições Alocação, Árvore de Chamadas e Funções.
As colunas Bytes e Tamanho Médio (Bytes) não aparecem por padrão. Para mostrá-las, clique com o botão direito do mouse na coluna Tipo ou Alocações e selecione as opções Bytes e Tamanho Médio (Bytes) para adicioná-las ao gráfico.
As duas colunas são semelhantes a Total (Alocações) e Próprio (Alocações), exceto que elas mostram a quantidade de memória utilizada em vez do número de objetos ocupando memória. Essas colunas aparecem apenas na exibição Alocação.
A coluna Nome do módulo mostra o módulo que contém a função ou o processo que está chamando.
Todas essas colunas são classificáveis. Para as colunas Tipo e Nome do Módulo, você pode classificar itens em ordem alfabética em ordem crescente ou decrescente. Para Alocações, Bytes e Tamanho Médio (Bytes), você pode classificar itens aumentando ou diminuindo o valor numérico.
Símbolos
Os seguintes símbolos aparecem nas guias Alocação, Árvore de Chamadas e Funções:
– Um tipo de valor, como inteiro
– uma coleção de tipos de valor, como matriz de inteiros
– um tipo de referência, como cadeia de caracteres
– uma coleção de tipos de referência, como matriz de cadeias de caracteres
Árvore de chamadas
A exibição Árvore de Chamadas mostra os caminhos de execução da função que contêm objetos que alocam muita memória.
As seguintes informações aparecem no modo de exibição Árvore de Chamadas:
- A coluna Nome da Função mostra o processo ou o nome da função que contém objetos que alocam memória. A exibição é baseada no nível do nó que você está inspecionando.
- As colunas Total (Alocações) e Tamanho Total (Bytes) mostram o número de objetos alocados e a quantidade de memória usada por uma função e todas as outras funções que ela chama. A coluna Tamanho total (bytes) se encontra oculta por padrão.
- As colunas Próprio (Alocações) e Tamanho Próprio (Bytes) mostram o número de objetos alocados e a quantidade de memória usada por apenas uma função ou tipo de alocação selecionado.
- A coluna Tamanho Médio (Bytes) mostra as mesmas informações que na exibição Alocações. Essa coluna é ocultada por padrão.
- A coluna Nome do módulo mostra o módulo que contém a função ou o processo que está chamando.
As opções adicionais que aparecem no modo de exibição Árvore de Chamadas incluem:
- O botão Expandir Caminho Crítico realça um caminho de execução de função que contém muitos objetos que estão alocando memória. O algoritmo começa em um nó selecionado e realça o caminho da maioria das alocações, orientando você na investigação.
- O botão Mostrar Caminho Crítico mostra ou oculta os símbolos de chama que indicam quais nós fazem parte do caminho crítico.
Funções
A exibição Funções mostra processos, módulos e funções que estão alocando memória.
As informações que aparecem na exibição Funções incluem:
A coluna Nome mostra os processos como os nós de nível mais alto. Os processos subjacentes são módulos e, abaixo dos módulos, há funções.
As colunas a seguir, que mostram as mesmas informações que nas exibições Alocação e Árvore de chamadas:
- Total (Alocações)
- Próprio (Alocações)
- Tamanho Total (Bytes)
- Tamanho Próprio (Bytes)
- Tamanho Médio (Bytes)
Coleção
A exibição Coleção mostra quantos objetos foram coletados ou retidos durante a coleta de lixo.
As seguintes informações aparecem na exibição Coleção.
- A coluna GC mostra a ID dessa coleta de lixo no ciclo de vida do arquivo executável.
- A coluna Geração mostra a geração da coleta de lixo.
- A coluna Tipo de GC mostra o tipo dessa coleta de lixo.
- A coluna Motivo do GC mostra o motivo desse evento de coleta de lixo.
- A coluna Duração da Pausa mostra o momento em que a execução foi bloqueada porque o coletor de lixo precisa de uso exclusivo do heap. Para uma coleta de lixo em segundo plano, esse valor é pequeno.
- A coluna Tamanho do LOH mostra o tamanho do heap de objetos grandes depois que o coletor de lixo foi executado.
- A coluna Tamanho do POH mostra o tamanho do heap de objetos fixados depois que o coletor de lixo foi executado.
- A coluna Finalizable Surv (MB) mostra o número de MB de objetos que têm finalizadores (destruidores) que sobreviveram à coleta de lixo.
- A coluna Objetos fixados mostra o número de objetos fixados que essa coleta de lixo promoveu.
- A coluna Coletados mostra o número de objetos captados pelo coletor de lixo.
- A coluna Persistidos mostra o número de objetos que persistiram após a execução do coletor de lixo.
Quando você seleciona uma linha, essa exibição também mostra gráficos de pizza para visualizar objetos coletados e sobrevividos por tipo.
Ferramentas de filtragem
As exibições Alocações, Árvore de Chamadas e Funções contêm as opções Mostrar Apenas Meu Código e Mostrar Código Nativo e uma caixa de filtro.
- Mostrar Apenas Meu Código recolhe sistemas, estruturas e outros códigos não do usuário em quadros de [Código Externo] para que você possa se concentrar apenas em seu código. Para obter mais informações, confira Depurar o código do usuário com Apenas Meu Código.
- Mostrar Código Nativo mostra o código nativo dentro do destino de análise e pode incluir código não de usuário.
- Com a caixa de filtro, você pode filtrar a coluna Nome ou Nome da função com base no valor fornecido. Insira um valor de cadeia de caracteres na caixa. Em seguida, a tabela mostra apenas os tipos que contêm essa cadeia de caracteres.