Partilhar via


Medir o uso de memória no Visual Studio (C#, Visual Basic, C++, F#)

Encontre fugas de memória e memória ineficiente enquanto depura com a ferramenta de diagnóstico Utilização de Memória integrada no depurador. A ferramenta de Utilização de Memória permite tirar um ou mais instantâneos do heap da memória gerida e nativa para ajudar a compreender o impacto dos tipos de objeto na utilização de memória. Você também pode analisar o uso de memória sem um depurador anexado ou direcionando um aplicativo em execução. Para obter mais informações, consulte Utilizar ferramentas de perfilagem em compilações de lançamento ou depuraçã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.

Embora você possa coletar instantâneos de memória a qualquer momento na ferramenta de uso de memória, você pode usar o depurador do Visual Studio para controlar como seu aplicativo é executado enquanto investiga problemas de desempenho. Definir pontos de paragem, executar passo a passo, interromper tudo e outras ações do depurador poderá ajudá-lo a concentrar as suas investigações de desempenho nos caminhos de código mais relevantes. Executar essas ações enquanto seu aplicativo está em execução pode eliminar o ruído do código que não lhe interessa e pode reduzir significativamente o tempo que você leva para diagnosticar um problema.

Importante

As Ferramentas de Diagnóstico integradas ao depurador têm suporte para desenvolvimento .NET no Visual Studio, incluindo aplicativos ASP.NET, ASP.NET Core, desenvolvimento nativo/C++ e modo misto (.NET e nativo).

Neste tutorial, você irá:

  • Faça capturas da memória
  • Analise dados de uso de memória

Se o Uso de Memória não fornecer os dados necessários, outras ferramentas de criação de perfil no Performance Profiler fornecem diferentes tipos de informações que podem ser úteis para si. Em muitos casos, o gargalo de desempenho da sua aplicação pode ser causado por algo diferente da sua memória, como a CPU, a renderização da interface do utilizador ou o tempo de resposta da rede.

Observação

Suporte ao Alocador Personalizado O analisador de memória nativo funciona ao recolher dados de eventos de alocação ETW emitidos em tempo de execução. Os alocadores no CRT e no SDK do Windows foram anotados ao nível do código-fonte para que os seus dados de alocação possam ser capturados. Se você estiver escrevendo seus próprios alocadores, todas as funções que retornam um ponteiro para a memória de pilha recém-alocada podem ser decoradas com __declspec(alocador), como visto neste exemplo para myMalloc:

__declspec(allocator) void* myMalloc(size_t size)

Coletar dados de uso de memória

  1. Abra o projeto que você deseja depurar no Visual Studio e defina um ponto de interrupção em seu aplicativo no ponto em que você deseja começar a examinar o uso da memória.

    Se você tiver uma área onde você suspeitar de um problema de memória, defina o primeiro ponto de interrupção antes que o problema de memória ocorra.

    Dica

    Como pode ser desafiador capturar o perfil de memória de uma operação que lhe interessa quando seu aplicativo frequentemente aloca e desaloca memória, defina pontos de interrupção no início e no final da operação (ou percorra a operação) para encontrar o ponto exato em que a memória foi alterada.

  2. Defina um segundo ponto de interrupção no final da função ou região de código que você deseja analisar (ou após ocorrer um problema de memória suspeito).

  3. A janela Ferramentas de Diagnóstico aparece automaticamente, a menos que você a tenha desativado. Para abrir a janela novamente, clique em Depurar>Windows>Mostrar Ferramentas de Diagnóstico.

  4. Escolha Uso de Memória com a configuração Selecionar Ferramentas na barra de ferramentas.

    Captura de ecrã das Ferramentas de Diagnóstico.

    Captura de ecrã das Ferramentas de Diagnóstico.

  5. Clique em Depurar / Iniciar Depuração (ou Iniciar na barra de ferramentas ou F5).

    Quando a aplicação terminar de carregar, será exibida a vista Resumo das Ferramentas de Diagnóstico.

    Captura de ecrã do separador Resumo das Ferramentas de Diagnóstico.

    Observação

    Como a coleta de dados de memória pode afetar o desempenho de depuração de seus aplicativos nativos ou de modo misto, os instantâneos de memória são desabilitados por padrão. Para habilitar instantâneos em aplicações nativas ou de modo misto, inicie uma sessão de depuração (tecla de atalho: F5). Quando a janela Ferramentas de Diagnóstico for exibida, escolha a guia Uso da Memória e, em seguida, escolhaPerfilagem de Pilha .

    Captura de tela de Ativar instantâneos.

    Pare (tecla de atalho: Shift+F5) e reinicie a depuração.

    Captura de ecrã do separador Resumo das Ferramentas de Diagnóstico.

    Observação

    Como a coleta de dados de memória pode afetar o desempenho de depuração de seus aplicativos nativos ou de modo misto, os instantâneos de memória são desabilitados por padrão. Para habilitar instantâneos em aplicações nativas ou de modo misto, inicie uma sessão de depuração (tecla de atalho: F5). Quando a janela Ferramentas de Diagnóstico for exibida, escolha o separador Uso da Memória e, em seguida, escolhaCriação de Perfil de Pilha .

    Captura de tela de Ativar capturas.

    Pare (tecla de atalho: Shift+F5) e reinicie a depuração.

  6. Para tirar um instantâneo no início da sessão de depuração, escolha Tirar instantâneo na barra de ferramentas de resumo Uso da memória. (Pode ajudar a definir um ponto de interrupção aqui também.)

    Captura de tela do botão Tirar instantâneo.

    Captura de tela do botão Tirar instantâneo.

    Dica

    Para criar uma linha de base para comparações de memória, considere tirar um instantâneo no início da sessão de depuração.

  7. Execute o cenário que fará com que seu primeiro ponto de interrupção seja atingido.

  8. Enquanto o depurador é pausado no primeiro ponto de interrupção, escolha Tirar instantâneo na barra de ferramentas de resumo Uso da memória .

  9. Pressione F5 para executar o aplicativo até o segundo ponto de interrupção.

  10. Agora, tire outro instantâneo.

    Neste ponto, você pode começar a analisar os dados.

    Se tiver problemas para coletar ou exibir dados, consulte Resolver erros de análise de perfil e corrigir problemas.

Analise dados de uso de memória

As linhas da tabela de resumo Uso de memória listam os instantâneos que você tirou durante a sessão de depuração e fornecem links para exibições mais detalhadas.

Captura de ecrã da tabela de uso de memória.

Captura de ecrã da tabela de uso de memória.

O nome da coluna depende do modo de depuração escolhido nas propriedades do projeto: .NET, nativo ou misto (.NET e nativo).

  • A coluna Objects (Diff) (.NET) ou Allocations (Diff) (C++) exibe o número de objetos no .NET ou na memória nativa quando o instantâneo foi tirado.

  • A coluna Heap Size (Diff) apresenta o número de bytes nos heaps .NET e nativos

Quando você tiver tirado vários instantâneos, as células da tabela de resumo incluirão a alteração no valor entre o instantâneo de linha e o instantâneo anterior.

Para analisar o uso da memória, clique em um dos links que abrem um relatório detalhado do uso da memória:

  • Para visualizar os detalhes da diferença entre o instantâneo atual e o instantâneo anterior, escolha o link de alteração à esquerda da seta (Aumento de uso de memória). Uma seta vermelha indica um aumento no uso de memória e uma seta verde indica uma diminuição.

Dica

Para ajudar a identificar problemas de memória mais rapidamente, os relatórios de diferenças são classificados por tipos de objeto que mais aumentaram em número geral (clique no link de alteração na coluna Objetos (Diferença)) ou que mais aumentaram no tamanho geral da pilha (clique no link de alteração na coluna Tamanho da Pilha (Diferença)).

  • Para exibir detalhes apenas do instantâneo selecionado, clique no link sem alterações.

    O relatório aparece em uma janela separada.

Relatórios de tipos gerenciados

Escolha o link atual de uma célula Objetos (Diff) na tabela de resumo de utilização 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 objetoDBG_MMA_InstancesIcon) 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 contagem e o tamanho dos tipos no instantâneo, incluindo o tamanho de todos os objetos referenciados pelo tipo (Inclusive Size).

A árvore de Caminhos para a 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.

Captura de tela do relatório de tipo gerenciado.

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 Size).

A árvore Caminhos para a 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.

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

Captura de ecrã do relatório Objetos referenciados.

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

Captura de tela do relatório Objetos referenciados.

Para exibir as ocorrências de um tipo selecionado no painel superior, clique no ícone Exibir instâncias ao lado do tipo de objeto.

Captura de ecrã da vista de Instâncias na ferramenta Utilização da Memória.

A exibição Instâncias exibe as instâncias do objeto selecionado no instantâneo no painel superior. O painel Caminhos para a raiz e Objetos Referenciados exibe os objetos que fazem referência à instância selecionada e os tipos aos quais a instância selecionada faz referência. Quando o depurador está parado no ponto onde o instantâneo foi tirado, pode-se passar o cursor sobre a célula Valor para exibir os valores do objeto numa dica de ferramenta.

Captura de ecrã da vista de Instâncias na ferramenta de Utilização de Memória.

A vista Instâncias exibe as instâncias do objeto selecionado no instantâneo na aba superior. O painel Caminhos para raiz e objetos referenciados exibe os objetos que fazem referência à instância selecionada e os tipos aos quais a instância selecionada faz referência. Quando o depurador é parado no ponto onde o instantâneo foi tirado, pode-se passar o mouse sobre a célula Valor para exibir os valores do objeto numa dica de ferramenta.

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 .

Visualização de Tipos de exibe o número e o tamanho dos tipos no instantâneo.

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

    A vista Instâncias exibe cada instância do tipo selecionado. Ao selecionar uma instância, a pilha de chamadas que resultou na criação da instância é exibida 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 o ícone de instâncias (O ícone de instância na coluna Tipo de objeto) de um tipo selecionado para exibir informações sobre os objetos do tipo selecionado no instantâneo.

    A vista 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.

    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 de Pilhas.

  • Escolha de exibição de pilhas na lista Modo de exibição 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 de Tipos Geridos e mostra os insights automáticos relevantes, como Cadeias de Caracteres Duplicadas, Matrizes Esparsase Fugas de Manipuladores de Eventos.

Captura de ecrã da vista de análise na ferramenta Utilização da Memória.

A seção Duplicate Strings mostra a lista de strings 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 terem campos que podem ser lidos para determinar o tamanho da memória nativa em que estão segurando. A aba do Insights mostra nós de memória simulados como nativos no grafo de objetos, que são retidos pelos seus objetos pai, de modo que a interface do utilizador os reconheça e exiba o seu tamanho e grafo de referências.

Captura de ecrã da visão original na ferramenta de Uso de Memória.

Relatórios de alteração (diferença)

  • Escolha o link de alteração em uma célula da tabela de resumo da guia Uso da Memória na janela Ferramentas de Diagnóstico .

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

    Captura de ecrã de Escolher 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.

    Captura de ecrã de escolha um instantâneo na lista

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 diferenças de 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 Size).

Blogs e vídeos

Analisar CPU e Memória Durante a Depuração

Blog do Visual C++: Criação de perfil de memória no Visual C++ 2015

Próximos passos

Neste tutorial, você aprendeu como coletar e analisar dados de uso de memória. Se já concluiu o tour do perfilador, poderá querer ler sobre uma abordagem geral para otimizar usando as ferramentas de perfilagem.

Neste tutorial, você aprendeu como coletar e analisar dados de uso de memória durante a depuração. Você pode querer saber mais sobre como analisar o uso de memória em compilações de versão usando o Performance Profiler.