Compartilhar via


Analisar o uso de memória em builds de versão (C#, Visual Basic, C++, F#)

A ferramenta Uso de Memória monitora o uso da memória do aplicativo. Você pode usar a ferramenta para estudar os efeitos de memória em tempo real de cenários que você está desenvolvendo ativamente no Visual Studio. Você pode tirar instantâneos detalhados dos estados de memória do aplicativo e comparar instantâneos para encontrar as causas raiz dos problemas de memória. A ferramenta Uso de Memória tem suporte em aplicativos .NET, ASP.NET, C++ou modo misto (.NET e nativos).

A ferramenta Uso de Memória pode executar em builds de versão ou de depuração. Neste artigo, mostramos como usar a ferramenta de uso de memória no Visual Studio Performance Profiler, que é recomendada para compilações de versão. Para obter informações sobre como escolher a melhor ferramenta de análise de memória para suas necessidades, consulte Escolha uma ferramenta de análise de memória.

Para obter a melhor experiência com esta documentação, escolha seu idioma de desenvolvimento preferido ou runtime na lista na parte superior do artigo.

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

Para iniciar uma 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 nativos).

  2. No menu Depurar, defina a configuração da solução como Liberar e selecione o destino de implantação.

    O destino de implantação normalmente corresponde ao nome do projeto, indicando uma implantação local.

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

  4. Em Ferramentas Disponíveis, selecione Uso de Memóriae, em seguida, selecione Iniciar.

    ! [OBSERVAÇÃO] Para alguns tipos de projeto, como o CMake, você deve definir o destino de inicialização como Executável. Para obter mais informações, consulte Quais ferramentas têm suporte para meu projeto?.

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 exibe um grafo de linha do tempo do uso da memória do aplicativo.

Captura de tela da janela Ferramentas de Diagnóstico no Profiler de Desempenho do Visual Studio mostrando um gráfico de linhas do tempo do uso da memória do aplicativo.

O grafo da linha do tempo mostra as flutuações de memória à medida que o aplicativo é executado. Picos no grafo geralmente indicam que algum código está coletando ou criando dados e, em seguida, descartando-os quando o processamento é feito. Picos grandes 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 de memória ineficiente ou até mesmo um vazamento de memória.

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

Um aplicativo usa um grande número de objetos e talvez você queira concentrar sua análise em um cenário. Ou talvez você encontre problemas de memória a serem investigados. Você pode tirar instantâneos durante uma sessão de diagnóstico para capturar o uso de memória em momentos específicos. É bom obter uma captura de referência de uma aplicação antes que um problema de memória apareça. 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.

Captura de tela ao tirar um instantâneo.

Fechar a sessão de diagnóstico

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

Captura de tela ao parar a coleta.

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

Depois de interromper a coleta de dados, a ferramenta de Uso de Memória interrompe o aplicativo e exibe a página de visão geral de Uso de Memória.

Captura de tela da página de visão geral na ferramenta Uso de Memória no Criador de Perfil de Desempenho do Visual Studio, mostrando um grafo de uso de memória e dois painéis de instantâneo.

Instantâneos de uso de memória

Os números nos painéis Captura de Tela mostram os objetos e bytes na memória no momento em que cada captura foi feita, e a diferença entre a captura de tela e a 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.

Captura de tela dos links de visualização de instantâneo

Para C++, a coluna Objetos (Comparação) é denominada Alocações (Comparação).

Imagem Descrição
Etapa 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.
Etapa 2 A diferença entre o número total de objetos de memória neste instantâneo e o 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.
Etapa 3 do Etapa 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.
Etapa 4 A diferença entre o tamanho total dos objetos de memória neste instantâneo e o instantâneo anterior. Um número positivo significa que o tamanho da memória desse instantâneo é maior 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 tipos gerenciados

Escolha o link atual de uma célula Objetos (Comparação) na tabela de resumo de Uso de Memória.

Captura de tela do relatório de tipo gerenciado.

Nota

Para código .NET, o ícone Instâncias de exibição (O ícone de instância na coluna Tipo de Objeto) só está disponível ao usar a ferramenta Uso de Memória integrada ao depurador ou quando você abre um instantâneo de heap e escolhe Depurar Memória Gerenciada.

O painel superior mostra a contagem e o tamanho dos tipos no instantâneo, incluindo o tamanho de todos os objetos referenciados pelo tipo (inclusive tamanho).

A árvore Caminhos para Raiz no painel inferior exibe os objetos que fazem referência ao tipo selecionado no painel superior. O coletor de lixo do .NET limpa a memória de um objeto somente quando o último tipo que faz referência a ele foi liberado. Para obter mais informações sobre como usar a árvore Caminhos para Raiz, confira Analisar o caminho crítico para raiz.

A árvore Tipos Referenciados exibe as referências mantidas pelo tipo selecionado no painel superior.

captura de tela do relatório Objetos Referenciados.

Filtros da árvore de relatórios

Muitos tipos em aplicativos não são necessários para que os desenvolvedores de aplicativos investiguem problemas de memória. 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.

Opções de classificação e filtro

  • Para filtrar uma árvore por nome de tipo, insira 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 Mostrar Apenas Meu Código na lista suspensa Filtrar para ocultar a maioria das instâncias geradas pelo código externo. Os tipos externos pertencem ao sistema operacional ou aos componentes da estrutura ou são gerados pelo compilador.

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

Relatórios de tipos nativos

Escolha o link atual de uma célula Alocações (Comparação) ou Tamanho do Heap (Comparação) na tabela de resumo de Uso de Memória da janela Ferramentas de Diagnóstico.

A Visão de Tipos exibe o número e o tamanho dos tipos na captura instantânea.

  • Escolha o ícone Exibir Instâncias ao lado de um tipo selecionado para exibir informações sobre os objetos selecionados no instantâneo.

    O modo de exibição Instâncias mostra cada instância do tipo selecionado. A seleção de uma instância exibe a pilha de chamadas resultou na criação da instância no painel Pilha de Chamadas de Alocação. (Essas informações só estão disponíveis durante a depuração.)

    Captura de tela do modo de exibição Instâncias e do painel Pilha de Chamadas de Alocação.

  • Escolha Pilhas para ver a pilha de alocação do tipo selecionado.

    Captura de tela da exibição de Pilhas.

Informações sobre o uso de memória

Para memória gerenciada, a ferramenta Análise de Memória também fornece várias informações automáticas internas avançadas. 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.

Captura de tela da exibição de insights na ferramenta Uso de Memória. de insights de Uso de Memória

A seção Cadeias de caracteres duplicadas mostra a lista de cadeias de caracteres alocadas várias vezes no heap. Além disso, esta seção mostra o total de memória desperdiçada, ou seja, o (número de instâncias – 1) vezes o tamanho da cadeia de caracteres.

A seção Matrizes Esparsas mostra matrizes preenchidas principalmente com zero elementos, que podem ser ineficientes em termos de desempenho e uso de memória. A ferramenta de análise de memória detectará automaticamente essas matrizes e mostrará a quantidade de memória que está sendo desperdiçada devido a esses valores zero.

A seção Perdas do manipulador de eventos, disponível no Visual Studio 2022 versão 17.9 Versão Prévia 1, mostra possíveis perdas de memória que podem ocorrer quando um objeto assina o evento de outro objeto. Se o editor do evento sobreviver ao assinante, o assinante permanecerá vivo, mesmo que não haja outras referências a ele. Isso pode levar a vazamentos de memória, em que a memória não utilizada não é liberada corretamente, fazendo com que o aplicativo use cada vez mais memória ao longo do tempo.

Alguns tipos são conhecidos por terem campos que podem ser lidos para determinar o tamanho da memória nativa que estão mantendo. A guia Insights mostra os nós de memória nativos falsos no gráfico de objetos, que foram retidos por seus objetos pai, de modo que a interface do usuário os reconheça e exiba seu tamanho e gráfico de referência.

Captura de tela da exibição de insights nativos na ferramenta Uso de Memória.

Relatórios de comparação (Diff)

  • Escolha o link de alteração em uma célula do painel Instantâneo na página de visão geral Uso de Memória.

    Captura de tela de Escolher um link de alteração em uma célula.

  • Escolha um instantâneo na lista Comparar com de um relatório gerenciado ou nativo.

    Captura de tela de Escolher um instantâneo da lista Comparar com.

O relatório de alteração adiciona colunas (marcadas com (Diff)) ao relatório base que mostram a diferença entre o valor do instantâneo base e o instantâneo de comparação. Veja como pode ser a aparência de um relatório de comparação Exibição de Tipo Nativo:

Captura de tela da exibição de comparação dos tipos nativos.

O painel superior mostra a contagem e o tamanho dos tipos no instantâneo, incluindo o tamanho de todos os objetos referenciados pelo tipo (inclusive tamanho).