Partilhar via


Analisar o uso de memória em compilações de versão (C#, Visual Basic, C++, F#)

A ferramenta de Uso de Memória monitora o uso de memória do seu 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 é suportada em aplicativos .NET, ASP.NET, C++ ou modo misto (.NET e nativo).

A ferramenta de Uso de Memória pode executar em compilações de lançamento ou de depuração. Neste artigo, mostramos como usar a ferramenta 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 sua linguagem de desenvolvimento ou tempo de execução preferido 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 Utilização da Memória suporta aplicações .NET, ASP.NET, C++ ou de modo misto (.NET e nativo).

  2. No menu Debug, defina a configuração da solução para Release e selecione o destino de implementação.

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

  3. Na barra de menus, selecione Depurar>Performance Profiler.

  4. Em Ferramentas Disponíveis, selecione Utilização da Memóriae, em seguida, selecione Iniciar.

    ! [NOTA] Para alguns tipos de projetos, como o CMake, deve definir o alvo de arranque para Executável. Para obter mais informações, consulte Quais ferramentas são suportadas para meu projeto?.

Monitorar o uso da memória

Quando inicia uma sessão de diagnóstico, a sua aplicação é iniciada e a janela Ferramentas de Diagnóstico exibe um gráfico de linha do tempo do uso de memória da sua aplicação.

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

O gráfico da linha do tempo mostra as flutuações de memória à medida que o aplicativo é executado. Picos no gráfico 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 um uso ineficiente da memória ou até mesmo um vazamento de memória.

Tire 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, poderá detetar problemas de memória que necessitem de investigação. Você pode tirar instantâneos durante uma sessão de diagnóstico para capturar o uso da memória em momentos específicos. É aconselhável obter uma imagem inicial de um aplicativo antes que surja um problema de memória. 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 quiser capturar os dados de memória.

Captura de tela de 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 terminar de recolher ou tiver captado instantâneos, selecione Parar recolha.

Captura de tela mostrando a interrupção da coleção.

Se tiveres problemas para coletar ou exibir dados, consulta Resolver erros de perfilagem e corrigir problemas.

Relatórios de uso de memória

Depois de parar a recolha de dados, a ferramenta Utilização da Memória para a aplicação e apresenta a página de descrição geral Utilização da Memória.

Captura de ecrã da página de visão geral na ferramenta Uso de Memória no Visual Studio Performance Profiler, mostrando um gráfico 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 do Instantâneo mostram os objetos e bytes na memória quando cada instantâneo foi tirado, assim como a diferença entre cada instantâneo e o anterior.

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

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

Para C++, a coluna Objects (Diff) é denominada Allocations (Diff).

Imagem Descrição
Etapa 1 O número total de objetos na memória quando o instantâneo foi tirado. Selecione este link para exibir um relatório de detalhes de 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 este link para exibir um relatório de comparação de instantâneo classificado pela diferença na contagem total de instâncias dos tipos.
Etapa 3 O número total de bytes na memória quando o instantâneo foi tirado. Selecione este link para exibir um relatório de detalhes de instantâneo classificado pelo tamanho total das instâncias de 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 deste instantâneo é maior do que o anterior, e um número negativo significa que o tamanho é menor. de linha de base significa que um instantâneo é o primeiro de uma sessão de diagnóstico. Sem diferença significa que a diferença é zero. Selecione este link para exibir um relatório de comparação de instantâneo 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 (Diff) na tabela de resumo do Uso de Memória.

Captura de tela do relatório de tipo gerenciado.

Observação

Para o código .NET, o ícone Exibir Instâncias (O ícone de instância na coluna Tipo de objeto) só está disponível ao usar a ferramenta de uso de memória integrada ao depurador de ou quando você abre um de instantâneo de pilha de e escolhe Depurar memória gerenciada.

O painel superior mostra a quantidade e o tamanho dos tipos no instantâneo, incluindo o tamanho de todos os objetos que são referenciados pelo tipo (Tamanho Inclusivo).

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 .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 o Paths to Root tree, consulte Analyze hot path to root.

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

Captura de tela do relatório Objetos referenciados.

Filtros de árvore de relatório

Muitos tipos de 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âneo 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 pelo nome do tipo, insira o nome na caixa de Filtro. O filtro não diferencia maiúsculas de minúsculas e reconhece a cadeia de caracteres especificada em qualquer parte do nome do tipo.

  • Selecione Mostrar Apenas Meu Código na lista suspensa Filtro de para ocultar a maioria das instâncias geradas por 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 Filtro de para ocultar tipos cuja Tamanho do (Bytes) seja inferior a 0,5% da memória total.

Relatórios de tipos nativos

Escolha o link atual de um de Alocações (Diff) ou célula Tamanho da Pilha (Diff) na tabela de resumo Uso da memória da janela Ferramentas de Diagnóstico do.

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

  • Selecione o ícone Ver instâncias ao lado de um tipo selecionado para mostrar informações sobre os objetos do tipo selecionado no instantâneo.

    A visão Instâncias exibe cada instância do tipo selecionado. A seleção de uma instância exibe a pilha de chamadas que 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 para o tipo selecionado.

    Captura de ecrã da vista Pilhas.

Informações sobre o uso da memória

Para memória gerenciada, a ferramenta Análise de Memória também fornece vários insights automáticos integrados poderosos. Selecione a guia Insights nos relatórios Tipos gerenciados e ela mostra os insights automáticos aplicáveis, como Duplicar cadeias de caracteres, Matrizes esparsase Vazamentos do manipulador de eventos.

Captura de ecrã da vista de insights na ferramenta Utilização da Memória.

A seção Duplicate Strings mostra a lista de cadeias de caracteres que são 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 que são preenchidas principalmente com elementos zero, o que pode ser ineficiente em termos de desempenho e uso de memória. A ferramenta de análise de memória detetará automaticamente essas matrizes e mostrará quanta memória está sendo desperdiçada devido a esses valores zero.

A seção Vazamentos do manipulador de eventos, disponível no Visual Studio 2022 versão 17.9 Preview 1, mostra possíveis vazamentos de memória que podem ocorrer quando um objeto se inscreve no evento de outro objeto. Se o editor do evento sobreviver ao assinante, este permanece vivo, mesmo que não haja outras referências a ele. Isso pode levar a vazamentos de memória, onde a memória não utilizada não é liberada corretamente, fazendo com que o aplicativo use mais e mais memória ao longo do tempo.

Certos tipos são conhecidos por ter campos que podem ser lidos para determinar o tamanho da memória nativa de que estão a utilizar. A guia do Insights mostra nós de memória nativos falsos no gráfico de objetos, que são 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 ecrã da visualização de insight nativa na ferramenta de Uso de Memória.

Relatórios de alteração (comparação)

  • Escolha o link de alteração numa célula do painel de Instantâneo na página de visão geral do uso da memória.

    Captura de ecrã de Escolha uma ligação de alteração numa célula.

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

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

O relatório de alterações 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 um relatório de comparação da Visualização de Tipo Nativa pode parecer:

Captura de tela da visualização de comparação de tipos nativos.

O painel superior mostra a quantidade e o tamanho dos tipos no instantâneo, incluindo o tamanho de todos os objetos que são referenciados pelo tipo (Tamanho Inclusivo).