Analisar o uso da memória sem depuração no Criador de Perfil de Desempenho (C#, Visual Basic, C++, F#)

A ferramenta Uso de Memória monitora o uso de memória do seu aplicativo. É possível usar a ferramenta para estudar os efeitos de memória em tempo real de cenários que você está desenvolvendo ativamente no Visual Studio. É possível tirar instantâneos detalhados dos estados de memória do aplicativo e compará-los para encontrar as causas raiz de problemas de memória. A ferramenta Uso de Memória é aceita em aplicativos .NET, ASP.NET, C++ou modo misto (.NET e nativo).

A ferramenta Uso de Memória pode ser executada com ou sem o depurador. Neste artigo, mostramos como usar a ferramenta Uso de Memória sem o depurador no Criador de Perfil de Desempenho do Visual Studio, que é recomendado para builds de versão. Para obter informações sobre como escolher a melhor ferramenta de análise de memória para suas necessidades, consulte Escolher uma ferramenta de análise de memória.

Sessões de diagnóstico de Uso de memória

Para iniciar uma a sessão de diagnóstico de uso de memória:

  1. Abra um projeto no Visual Studio.

    A ferramenta Uso de Memória dá suporte a aplicativos .NET, ASP.NET, C++ou modo misto (.NET e nativo).

  2. No menu Depurar, defina a configuração da solução como Versão e selecione Depurador Local do Windows (ou Computador local) como o destino de implantação.

  3. Na barra de menus, selecione Depurar>Criador de Perfil de Desempenho.

  4. Em Ferramentas Disponíveis, selecione Uso da Memória e, em seguida, selecione Iniciar.

    Start a Memory Usage diagnostic session

Monitorar o uso de memória

Quando você inicia uma sessão de diagnóstico, seu aplicativo é iniciado e a janela Ferramentas de Diagnóstico mostra um grafo de linha do tempo do uso de memória do aplicativo.

Screenshot of the Diagnostic Tools window in the Visual Studio Performance Profiler showing a timeline graph of the app's memory use.

Screenshot of the Diagnostic Tools window in the Visual Studio Performance Profiler showing a timeline graph of the app's memory use.

O grafo de linha do tempo mostra flutuações de memória à medida que o aplicativo é executado. Picos no gráfico geralmente indicam que um código está coletando ou criando dados e, em seguida, descartando-os quando o processamento é concluído. Grandes picos indicam áreas que você pode otimizar. A principal preocupação é um aumento no consumo de memória que não é retornado. Isso pode indicar o uso ineficiente de memória ou até mesmo uma perda de memória.

Tirar instantâneos dos estados de memória do aplicativo

Um aplicativo usa um grande número de objetos e talvez convenha concentrar sua análise em um cenário. Ou talvez você encontre problemas de memória a serem investigados. É possível tirar instantâneos durante uma sessão de diagnóstico para capturar o uso de memória em momentos específicos. É bom obter um instantâneo de linha de base de um aplicativo antes que um problema de memória seja exibido. Você pode tirar outro instantâneo após a primeira ocorrência do problema e instantâneos adicionais se puder repetir o cenário.

Para coletar instantâneos, selecione Tirar instantâneo quando desejar capturar os dados de memória.

Fechar a sessão de diagnóstico

Para parar uma sessão de monitoramento sem criar um relatório, apenas feche a janela de diagnóstico. Para gerar um relatório quando você terminar de coletar ou tiver tirado instantâneos, selecione Interromper Coleta.

Stop Collection

Se você tiver problemas para coletar ou exibir dados, confira Solucionar erros de criação de perfil e corrigir problemas.

Relatórios de uso de memória

Após interromper a coleta de dados, a ferramenta Uso de Memória interromperá o aplicativo e exibirá a página de visão geral Uso de Memória.

Screenshot of the overview page in the Memory Usage tool in the Visual Studio Performance Profiler, showing a memory usage graph and two snapshot panes.

Screenshot of the overview page in the Memory Usage tool in the Visual Studio Performance Profiler, showing a memory usage graph and two snapshot panes.

Instantâneos do uso de memória

Os números nos painéis Instantâneo mostram os objetos e bytes na memória quando cada instantâneo foi tirado e a diferença entre o instantâneo e o anterior.

Os números são links que abrem exibições do relatório Uso de Memória detalhadas em novas janelas do Visual Studio. Um relatório de detalhes do instantâneo mostra os tipos e instâncias em um instantâneo. Um relatório de comparações de diferenças de instantâneos compara os tipos e as instâncias em dois instantâneos.

Snapshot view links

Imagem Descrição
Step 1 O número total de bytes na memória quando o instantâneo foi tirado. Selecione esse link para exibir um relatório de detalhes do instantâneo classificado pelo tamanho total de instâncias do tipo.
Step 2 O número total de objetos na memória quando o instantâneo foi tirado. Selecione esse link para exibir um relatório de detalhes do instantâneo classificado pela contagem de instâncias dos tipos.
Step 3 A diferença entre o tamanho total de objetos de memória neste instantâneo e o instantâneo anterior. Um número positivo significa que o tamanho da memória deste instantâneo é maior do que o anterior e um número negativo significa que o tamanho é menor. Linha de base significa que um instantâneo é o primeiro em uma sessão de diagnóstico. Nenhuma diferença significa que a diferença é zero. Selecione esse link para exibir um relatório de diferenças de instantâneos classificado pela diferença no tamanho total das instâncias dos tipos.
Step 4 A diferença entre o número total de objetos de memória neste instantâneo e no instantâneo anterior. Selecione este link para exibir um relatório de comparação de instantâneos. Ele é classificado pela diferença na contagem total de instâncias dos tipos.

Snapshot view links

Imagem Descrição
Step 1 O número total de objetos na memória quando o instantâneo foi tirado. Selecione esse link para exibir um relatório de detalhes do instantâneo classificado pela contagem de instâncias dos tipos.
Step 2 A diferença entre o número total de objetos de memória neste instantâneo e no instantâneo anterior. Selecione esse link para exibir um relatório de diferenças de instantâneos classificado pela diferença na contagem total de instâncias dos tipos.
Step 3 O número total de bytes na memória quando o instantâneo foi tirado. Selecione esse link para exibir um relatório de detalhes do instantâneo classificado pelo tamanho total de instâncias do tipo.
Step 4 A diferença entre o tamanho total de objetos de memória neste instantâneo e o instantâneo anterior. Um número positivo significa que o tamanho da memória deste instantâneo é maior do que o anterior e um número negativo significa que o tamanho é menor. Linha de base significa que um instantâneo é o primeiro em uma sessão de diagnóstico. Nenhuma diferença significa que a diferença é zero. Selecione esse link para exibir um relatório de diferenças de instantâneos classificado pela diferença no tamanho total das instâncias dos tipos.

Relatórios de instantâneo de Uso de Memória

Quando você seleciona um dos links do instantâneo na página de visão geral Uso de Memória, um relatório de instantâneos é aberto em uma nova página.

Memory Usage snapshot report

Memory Usage snapshot report

Se um Tipo de Objeto for azul, será possível selecioná-lo para navegar até o objeto no código-fonte, em uma janela separada.

Os tipos que você não puder identificar ou cujo envolvimento no seu código você não entende serão provavelmente .NET, sistema operacional ou objetos de compilador. A ferramenta Uso de Memória exibirá esses objetos se eles estiverem envolvidos nas cadeias de propriedade de seus objetos.

No relatório de instantâneos:

  • A árvore de Memória gerenciada mostra os tipos e as instâncias no relatório. Escolher um tipo ou instância exibe as árvores Caminhos para a Raiz e Objetos Referenciados para o item selecionado.

  • A árvore Caminhos para a Raiz mostra a cadeia de objetos que referenciam um tipo ou uma instância. O coletor de lixo .NET limpa a memória de um objeto apenas quando todas as referências a ele foram liberadas.

  • A árvore Tipos Referenciados ou Objetos Referenciados mostra os objetos que a instância ou tipo selecionado referencia.

Filtros da árvore de relatórios

Muitos tipos em aplicativos não são exigidos para os desenvolvedores de aplicativos. Os filtros de relatório de instantâneos podem ocultar a maioria desses tipos nas árvores de Memória gerenciada e Caminhos para a Raiz.

Sort and filter options

Sort and filter options

  • Para filtrar uma árvore por nome de tipo, digite o nome na caixa Filtrar. O filtro não diferencia maiúsculas de minúsculas e reconhece a cadeia de caracteres especificada em qualquer parte dos nomes do tipo.

  • Selecione Recolher Pequenos Objetos na lista suspenso Filtrar para ocultar os tipos cujo Tamanho (bytes) é inferior a 0,5% do total de memória.

  • Selecione Apenas Meu Código na lista suspensa Filtrar para ocultar a maioria das instâncias geradas pelo código externo. Tipos externos pertencem ao sistema operacional ou aos componentes de estrutura ou são gerados pelo compilador.

Relatórios de detalhes do instantâneo

Um relatório de detalhes do instantâneo descreve um instantâneo de uma sessão de diagnóstico. Para abrir o relatório, selecione o link de tamanho ou de objetos em um painel de instantâneo.

Links to snapshot report in a snapshot pane

Links to snapshot report in a snapshot pane

Os dois links abrem o mesmo relatório. A única diferença é a ordem de classificação inicial da árvore de Memória gerenciada. O link do tamanho classifica o relatório pela coluna Tamanho Inclusivo (Bytes). O link objetos classifica o relatório pela coluna Contagem. É possível alterar a ordem ou coluna de classificação depois que o relatório é aberto.

Árvore de Memória gerenciada (relatórios de detalhes do instantâneo)

A árvore Memória gerenciada lista os tipos de objetos que são mantidos na memória. Expanda um nome do tipo para exibir as 10 maiores instâncias do tipo, classificadas por tamanho. Selecione um tipo ou instância para exibir as árvores Caminhos para a Raiz e Objetos Referenciados para o item selecionado.

Managed Heap tree

Managed Memory tree

A árvore de Memória gerenciada em um relatório de detalhes do instantâneo tem as seguintes colunas:

Nome Descrição
Tipo de Objeto O nome do tipo ou instância de objeto.
Count O número de instâncias do objeto do tipo. Contagem é sempre 1 para uma instância.
Tamanho (bytes) Para um tipo, o tamanho de todas as instâncias do tipo no instantâneo, menos o tamanho dos objetos contidos nas instâncias. Para uma instância, o tamanho do objeto, menos o tamanho dos objetos contidos na instância.
Tamanho Inclusivo (Bytes) O tamanho das instâncias do tipo ou o tamanho de uma única instância, incluindo o tamanho dos objetos contidos.
Módulo O módulo que contém o objeto.

Árvore de Caminhos para a Raiz (relatórios detalhes do instantâneo)

A árvore Caminhos para a Raiz mostra a cadeia de objetos que referenciam um tipo ou uma instância. O coletor de lixo .NET limpa a memória de um objeto apenas quando todas as referências a ele foram liberadas.

Para um tipo na árvore Caminhos para a Raiz, o número de objetos que têm referências para esse tipo é exibido na coluna Contagem de Referência.

Paths to Root tree for types

Paths to Root tree for types

Árvore de Tipos referenciados ou de Objetos referenciados (relatórios de detalhes do instantâneo)

A árvore Tipos Referenciados ou Objetos Referenciados mostra os objetos que a instância ou tipo selecionado referencia.

Referenced Objects tree for instances

Referenced Objects tree for instances

A árvore de Tipos Referenciados em um relatório de detalhes do instantâneo tem as seguintes colunas. Uma árvore de Objetos Referenciados não tem a coluna Contagem de Referência.

Nome Descrição
Tipo de Objeto ou Instância O nome do tipo ou da instância.
Contagem de Referência No caso de tipos, o número de instâncias de objeto do tipo.
Tamanho (bytes) No caso de um tipo, o tamanho de todas as instâncias do tipo, menos o tamanho dos objetos contidos no tipo. No caso de uma instância, o tamanho do objeto, menos o tamanho dos objetos contidos no objeto.
Tamanho Inclusivo (Bytes) O tamanho total das instâncias do tipo ou o tamanho da instância, incluindo o tamanho dos objetos contidos.
Módulo O módulo que contém o objeto.

Relatório de diferenças (dif) do instantâneo

Um relatório de diferenças de instantâneos mostra as alterações entre um instantâneo primário e o instantâneo anterior. Para abrir um relatório de diferenças, selecione um dos links de diferenças em um painel de instantâneo.

Os dois links abrem o mesmo relatório. A única diferença é a ordem de classificação inicial da árvore de Memória Gerenciada no relatório. O link do tamanho classifica o relatório pela coluna Diferenças de Tamanho Inclusivo (Bytes). O link de objetos classifica o relatório pela coluna Diferença de Contagem. É possível alterar a ordem ou coluna de classificação depois que o relatório é aberto.

Links to difference report in a snapshot pane

Links to difference report in a snapshot pane

Árvore de Memória Gerenciada (relatórios de diferenças de instantâneos)

A árvore Memória gerenciada lista os tipos de objetos que são mantidos na memória. Você pode expandir um nome do tipo para ver as dez maiores instâncias do tipo, classificadas por tamanho. Selecione um tipo ou instância para exibir as árvores Caminhos para a Raiz e Objetos Referenciados para o item selecionado.

Managed Heap tree for a type in difference report

Managed Memory tree for a type in difference report

A árvore de Memória Gerenciada em um relatório de diferenças de instantâneos tem as seguintes colunas:

Nome Descrição
Tipo de Objeto O nome do tipo ou instância de objeto.
Count O número de instâncias de um tipo no instantâneo primário. Contagem é sempre 1 para uma instância.
Dif. de Contagem No caso de um tipo, a diferença no número de instâncias do tipo entre o instantâneo primário e o instantâneo anterior. O campo fica em branco no caso de uma instância.
Tamanho (bytes) O tamanho dos objetos no instantâneo primário, menos o tamanho dos objetos nos objetos. No caso de um tipo, Tamanho (Bytes) e Tamanho Inclusivo (Bytes) são os totais dos tamanhos das instâncias de tipo.
Dif. de Tamanho Total (Bytes) No caso de um tipo, a diferença no tamanho total de instâncias do tipo entre o instantâneo primário e o instantâneo anterior, menos o tamanho dos objetos nas instâncias. O campo fica em branco no caso de uma instância.
Tamanho Inclusivo (Bytes) O tamanho dos objetos no instantâneo primário, incluindo o tamanho dos objetos nos objetos.
Diferença de Tamanho Inclusivo (Bytes) No caso de um tipo, a diferença no tamanho de todas as instâncias do tipo entre o instantâneo primário e o instantâneo anterior, incluindo o tamanho dos objetos nos objetos. O campo fica em branco no caso de uma instância.
Módulo O módulo que contém o objeto.

Árvore de Caminhos para a Raiz (relatórios de diferenças de instantâneos)

A árvore Caminhos para a Raiz mostra a cadeia de objetos que referenciam um tipo ou uma instância. O coletor de lixo .NET limpa a memória de um objeto apenas quando todas as referências a ele foram liberadas.

Para um tipo na árvore Caminhos para a Raiz, o número de objetos que têm referências para esse tipo é exibido na coluna Contagem de Referência. A diferença na contagem do instantâneo anterior é a coluna Diferença de Referência.

Paths To Root tree in a diff report

Paths To Root tree in a diff report

Árvore de Tipos referenciados ou de Objetos referenciados (relatórios de diferenças de instantâneos)

A árvore Tipos Referenciados ou Objetos Referenciados mostra os objetos que a instância ou tipo selecionado referencia.

Referenced Types in a diff report

Referenced Types in a diff report

Uma árvore Tipos Referenciados em um relatório de diferenças de instantâneos tem as seguintes colunas. Uma árvore de Objetos Referenciados tem as colunas Instância, Tamanho (Bytes), Tamanho Inclusivo (Bytes) e Módulo.

Nome Descrição
Tipo de Objeto ou Instância O nome do tipo ou instância de objeto.
Contagem de Referência O número de instâncias de um tipo no instantâneo primário.
Diferença de Contagem de referência No caso de um tipo, a diferença no número de instâncias do tipo entre o instantâneo primário e o instantâneo anterior.
Tamanho (bytes) O tamanho dos objetos no instantâneo primário, menos o tamanho dos objetos nos objetos. No caso de um tipo, Tamanho (Bytes) e Tamanho Inclusivo (Bytes) são os totais dos tamanhos das instâncias de tipo.
Dif. de Tamanho Total (Bytes) No caso de um tipo, a diferença no tamanho total de instâncias do tipo entre o instantâneo primário e o instantâneo anterior, menos o tamanho dos objetos nas instâncias.
Tamanho Inclusivo (Bytes) O tamanho dos objetos no instantâneo primário, incluindo o tamanho dos objetos nos objetos.
Diferença de Tamanho Inclusivo (Bytes) No caso de um tipo, a diferença no tamanho de todas as instâncias do tipo entre o instantâneo primário e o instantâneo anterior, incluindo o tamanho dos objetos nos objetos.
Módulo O módulo que contém o objeto.

Relatório de insights

No Visual Studio 2022, a ferramenta Análise de Memória também oferece vários insights automáticos integrados e avançados para memória gerenciada. Selecione a guia Insights nos relatórios de tipos gerenciados e ela mostrará os insights automáticos aplicáveis, como Strings duplicadas e Matrizes esparsas e Perdas do manipulador de eventos. Para saber mais, confira Insights de uso de memória.

Screenshot of Managed memory insights.