Medir o uso de memória no Visual StudioMeasure memory usage in Visual Studio

Encontre vazamentos de memória e memória ineficiente enquanto estiver depurando com a ferramenta de diagnóstico Uso de Memória integrada ao depurador.Find memory leaks and inefficient memory while you're debugging with the debugger-integrated Memory Usage diagnostic tool. A ferramenta Uso de Memória permite que você obtenha um ou mais instantâneos do heap de memória gerenciada e do heap de memória nativa para entender o impacto do uso de memória dos tipos de objeto.The Memory Usage tool lets you take one or more snapshots of the managed and native memory heap to help understand the memory usage impact of object types. Você também pode analisar o uso de memória sem um depurador anexado ou direcionando a um aplicativo em execução.You can also analyze memory usage without a debugger attached or by targeting a running app. Para obter mais informações, consulte executar ferramentas de criação de perfil com ou sem o depurador.For more information, see Run profiling tools with or without the debugger.

Embora você possa coletar instantâneos de memória a qualquer momento na ferramenta Uso de Memória, pode usar o depurador do Visual Studio para controlar como o seu aplicativo é executado ao investigar problemas de desempenho.Although you can collect memory snapshots at any time in the Memory Usage tool, you can use the Visual Studio debugger to control how your application executes while investigating performance issues. A definição de pontos de interrupção, passo a passo, Interromper Tudo e outras ações de depurador podem ajudá-lo a concentrar as investigações de desempenho nos caminhos de código mais relevantes.Setting breakpoints, stepping, Break All, and other debugger actions can help you focus your performance investigations on the code paths that are most relevant. A execução dessas ações enquanto o aplicativo é executado pode eliminar o ruído do código que não lhe interessa e reduzir significativamente a quantidade de tempo necessário para diagnosticar um problema.Performing those actions while your app is running can eliminate the noise from the code that doesn't interest you and can significantly reduce the amount of time it takes you to diagnose an issue.

Importante

As ferramentas de diagnóstico integradas ao depurador têm suporte para o desenvolvimento do .NET no Visual Studio, incluindo ASP.NET, ASP.NET Core, desenvolvimento nativo/C++ e aplicativos de modo misto (.NET e nativo).The debugger-integrated Diagnostics Tools are supported for .NET development in Visual Studio, including ASP.NET, ASP.NET Core, native/C++ development, and mixed mode (.NET and native) apps. O Windows 8 ou posterior é necessário para executar ferramentas de criação de perfil com o depurador (janela Ferramentas de Diagnóstico).Windows 8 and later is required to run profiling tools with the debugger (Diagnostic Tools window).

Neste tutorial, você irá:In this tutorial, you will:

  • Tirar instantâneos da memóriaTake snapshots of memory
  • Analisar dados de uso de memóriaAnalyze memory usage data

Se o uso de memória não fornecer os dados de que você precisa, outras ferramentas de criação de perfil no criador de perfil de desempenho fornecerão diferentes tipos de informações que podem ser úteis para você.If Memory Usage does not give you the data that you need, other profiling tools in the Performance Profiler provide different kinds of information that might be helpful to you. Em muitos casos, o afunilamento de desempenho do seu aplicativo pode ser causado por algo diferente da memória, como CPU, renderização da interface do usuário ou tempo de solicitação de rede.In many cases, the performance bottleneck of your application may be caused by something other than your memory, such as CPU, rendering UI, or network request time.

Observação

Suporte a alocador personalizado O criador de perfil de memória nativa funciona coletando dados de eventos ETW de alocação emitidos durante o tempo de execução.Custom Allocator Support The native memory profiler works by collecting allocation ETW event data emitted during run time. Os alocadores no CRT e no SDK do Windows foram anotados no nível de origem para que seus dados de alocação possam ser capturados.Allocators in the CRT and Windows SDK have been annotated at the source level so that their allocation data can be captured. Se você estiver escrevendo seus próprios alocadores, todas as funções que retornarem um ponteiro para uma memória heap recém-alocada poderão ser decoradas com __declspec(allocator), como visto neste exemplo de myMalloc:If you are writing your own allocators, then any functions that return a pointer to newly allocated heap memory can be decorated with __declspec(allocator), as seen in this example for myMalloc:

__declspec(allocator) void* myMalloc(size_t size)

Coletar dados de uso de memóriaCollect memory usage data

  1. Abra o projeto que deseja depurar no Visual Studio e defina um ponto de interrupção no aplicativo no ponto em que deseja começar a examinar o uso da memória.Open the project you want to debug in Visual Studio and set a breakpoint in your app at the point where you want to begin examining memory usage.

    Se houver uma área em que você suspeite de um problema de memória, defina o primeiro ponto de interrupção antes que ocorra o problema de memória.If you have an area where you suspect a memory issue, set the first breakpoint before the memory issue occurs.

    Dica

    Como pode ser um desafio capturar o perfil de memória de uma operação de seu interesse quando o aplicativo aloca e desaloca memória com frequência, defina pontos de interrupção no início e no final da operação (ou percorra a operação) para localizar o ponto exato em que a memória foi alterada.Because it can be challenging to capture the memory profile of an operation that interests you when your app frequently allocates and de-allocates memory, set breakpoints at the start and end of the operation (or step through the operation) to find the exact point that memory changed.

  2. Defina um segundo ponto de interrupção ao fim da função ou região de código que você deseja analisar (ou após a ocorrência de um problema de memória suspeito).Set a second breakpoint at the end of the function or region of code that you want to analyze (or after a suspected memory issue occurs).

  3. A janela de ferramentas de diagnóstico aparece automaticamente, a menos que você a tenha desativado.The Diagnostic Tools window appears automatically unless you have turned it off. Para exibir a janela novamente, clique em depurar > janelas > Mostrar ferramentas de diagnóstico.To bring up the window again, click Debug > Windows > Show Diagnostic Tools.

  4. Escolha Uso de Memória com a configuração Selecionar Ferramentas na barra de ferramentas.Choose Memory Usage with the Select Tools setting on the toolbar.

    Mostrar ferramentas de diagnósticoShow Diagnostics Tools

  5. Clique em Depurar/Iniciar Depuração (ou em Iniciar na barra de ferramentas ou em F5).Click Debug / Start Debugging (or Start on the toolbar, or F5).

    Quando o aplicativo terminar de ser carregado, a exibição Resumo das Ferramentas de Diagnóstico será exibida.When the app finishes loading, the Summary view of the Diagnostics Tools appears.

    Guia Resumo das ferramentas de diagnósticoDiagnostics Tools Summary Tab

    Observação

    Como a coleta de dados de memória pode afetar o desempenho de depuração de seus aplicativos mistos ou nativos, os instantâneos de memória são desabilitados por padrão.Because collecting memory data can affect the debugging performance of your native or mixed-mode apps, memory snapshots are disabled by default. Para habilitar instantâneos de aplicativos mistos ou nativos, inicie uma sessão de depuração (Tecla de atalho: F5).To enable snapshots in native or mixed-mode apps, start a debugging session (Shortcut key: F5). Quando a janela Ferramentas de Diagnóstico for exibida, escolha a guia Uso de Memória e, em seguida, Criação de Perfil de Heap.When the Diagnostic Tools window appears, choose the Memory Usage tab, and then choose Heap Profiling.

    Habilitar instantâneosEnable snapshots

    Pare (tecla de atalho: Shift + F5) e reinicie a depuração.Stop (Shortcut key: Shift+F5) and restart debugging.

  6. Para obter um instantâneo no início da sessão de depuração, escolha Tirar instantâneo na barra de ferramentas de resumo Uso de Memória.To take a snapshot at the start of your debugging session, choose Take snapshot on the Memory Usage summary toolbar. (Talvez seja útil definir um ponto de interrupção aqui também.)(It may help to set a breakpoint here as well.)

    Tirar instantâneoTake snapshot

    Dica

    Para criar uma linha de base para comparações de memória, tire um instantâneo no início da sessão de depuração.To create a baseline for memory comparisons, consider taking a snapshot at the start of your debugging session.

  7. Execute o cenário que fará com que o primeiro ponto de interrupção seja atingido.Run the scenario that will cause your first breakpoint to be hit.

  8. Enquanto o depurador estiver pausado no primeiro ponto de interrupção, escolha Tirar instantâneo na barra de ferramentas de resumo Uso de Memória.While the debugger is paused at the first breakpoint, choose Take snapshot on the Memory Usage summary toolbar.

  9. Pressione F5 para executar o aplicativo até o segundo ponto de interrupção.Press F5 to run the app to your second breakpoint.

  10. Agora, crie outro instantâneo.Now, take another snapshot.

    Neste ponto, você pode começar a analisar os dados.At this point, you can begin to analyze the data.

Analisar dados de uso de memóriaAnalyze memory usage data

As linhas da tabela de resumo de Uso de Memória listam os instantâneos que você criou durante a sessão de depuração e fornecem links para modos de exibição mais detalhados.The rows of Memory Usage summary table lists the snapshots that you have taken during the debugging session and provides links to more detailed views.

Tabela de Resumo de memóriaMemory summary table

O nome das colunas depende do modo de depuração escolhido nas propriedades do projeto: .NET, nativo ou misto (.NET e nativo).The name of the columns depend on the debugging mode you choose in the project properties: .NET, native, or mixed (both .NET and native).

  • As colunas Objetos (Diff) e Alocações (Diff) exibem o número de objetos no .NET e na memória nativa quando o instantâneo foi criado.The Objects (Diff) and Allocations (Diff) columns display the number of objects in .NET and native memory when the snapshot was taken.

  • A coluna Tamanho do Heap (Diff) exibe o número de bytes no .NET e heaps nativosThe Heap Size (Diff) column displays the number of bytes in the .NET and native heaps

Quando você tira vários instantâneos, as células da tabela de resumo incluem a alteração no valor entre o instantâneo de linha e o instantâneo anterior.When you have taken multiple snapshots, the cells of the summary table include the change in the value between the row snapshot and the previous snapshot.

Para analisar o uso da memória, clique em um dos links que abre um relatório detalhado do uso de memória:To analyze memory usage, click one of the links that opens up a detailed report of memory usage:

  • Para exibir detalhes da diferença entre o instantâneo atual e o instantâneo anterior, escolha o link alterar à esquerda da seta (aumento de uso de memória).To view details of the difference between the current snapshot and the previous snapshot, choose the change link to the left of the arrow (Memory Usage Increase). Uma seta vermelha indica um aumento no uso de memória e uma seta verde indica uma diminuição.A red arrow indicates an increase in memory usage, and a green arrow to indicates a decrease.

Dica

Para ajudar a identificar problemas de memória mais rapidamente, os relatórios de comparação são classificados pelos tipos de objeto que mais aumentaram no número geral (clique no link de alteração na coluna Objetos (Comparação)) ou que mais aumentaram quanto ao tamanho geral do heap (clique no link de alteração na coluna Tamanho do Heap (Comparação)).To help identify memory issues more quickly, the diff reports are sorted by object types that increased the most in overall number (click the change link in Objects (Diff) column) or that increased the most in overall heap size (click the change link in Heap Size (Diff) column).

  • Para exibir detalhes apenas do instantâneo selecionado, clique no link que não é de alteração.To view details of only the selected snapshot, click the non-change link.

    O relatório é exibido em uma janela separada.The report appears in a separate window.

Relatórios de tipos gerenciadosManaged types reports

Escolha o link atual de uma célula Objetos (Diff) ou Alocações (Diff) da tabela de resumo de Uso de Memória.Choose the current link of a Objects (Diff) or Allocations (Diff) cell in the Memory Usage summary table.

Relatório de tipo gerenciado do depurador - caminhos para raizDebugger managed type report - Paths to Root

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).The top pane shows the count and size of the types in the snapshot, including the size of all objects that are referenced by the type (Inclusive Size).

A árvore Caminhos para a Raiz no painel inferior exibe os objetos que referenciam o tipo selecionado no painel superior.The Paths to Root tree in the bottom pane displays the objects that reference the type selected in the upper pane. 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.The .NET garbage collector cleans up the memory for an object only when the last type that references it has been released.

A árvore objetos referenciados exibe as referências que são mantidas pelo tipo selecionado no painel superior.The Referenced Objects tree displays the references that are held by the type selected in the upper pane.

Exibição de relatório de objetos referenciados gerenciadosManaged referenced objects report view

Para exibir as instâncias de um tipo selecionado no painel superior, escolha o ícone do ícone de instância .To display the instances of a selected type in the upper pane, choose the Instance icon icon.

Captura de tela da exibição de instâncias na ferramenta de uso de memória do Visual Studio, mostrando o painel instâncias e os caminhos para o painel objetos de referência e raiz.Screenshot of the Instances view in the Visual Studio Memory Usage tool, showing the Instances pane and the Paths to Root and Referenced Objects pane.

O modo de exibição Instâncias exibe as instâncias do objeto selecionado no instantâneo no painel superior.The Instances view displays the instances of the selected object in the snapshot in the upper pane. O painel Caminhos para Raiz e Objetos Referenciados exibe os objetos que referenciam a instância selecionada e os tipos de que a instância selecionada referencia.The Paths to Root and Referenced Objects pane displays the objects that reference the selected instance and the types that the selected instance references. Quando o depurador é interrompido no ponto em que o instantâneo foi tirado, você pode passar o mouse sobre a célula Valor para exibir os valores do objeto em uma dica de ferramenta.When the debugger is stopped at the point where the snapshot was taken, you can hover over the Value cell to display the values of the object in a tool tip.

Relatórios de tipo nativoNative type reports

Escolha o link atual de uma célula Alocações (Diff) ou Tamanho do Heap (Diff) na tabela de resumo de Uso de Memória da janela Ferramentas de Diagnóstico.Choose the current link of a Allocations (Diff) or Heap Size (Diff) cell in the Memory Usage summary table of the Diagnostic Tools window.

Exibição de tipo nativoNative Type View

O Modo de exibição de tipos exibe o número e tamanho dos tipos no instantâneo.The Types View displays the number and size of the types in the snapshot.

  • Escolha o ícone 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.Choose the instances icon (The instance icon in the Object Type column) of a selected type to display information about the objects of the selected type in the snapshot.

    O modo de exibição Instâncias mostra cada instância do tipo selecionado.The Instances view displays each instance of the selected type. 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.Selecting an instance displays the call stack that resulted in the creation of the instance in the Allocation Call Stack pane.

    Captura de tela da exibição de instâncias na ferramenta de uso de memória do Visual Studio, mostrando o painel instâncias e o painel de pilha de chamadas de alocação.Screenshot of the Instances view in the Visual Studio Memory Usage tool, showing the Instances pane and the Allocation Call Stack pane.

  • Escolha Exibição de Pilhas na lista Exibir Modo para ver a pilha de alocação do tipo selecionado.Choose Stacks View in the View Mode list to see the allocation stack for the selected type.

    Exibição de pilhasStacks View

Relatórios de comparação (Diff)Change (Diff) reports

  • Escolha o link de alteração em uma célula da tabela de resumo da guia Uso de Memória na janela Ferramentas de Diagnóstico.Choose the change link in a cell of the summary table of the Memory Usage tab on the Diagnostic Tools window.

    Escolha uma alteração (relatório de) diffChoose a change (diff) report

  • Escolha um instantâneo na lista Comparar com de um relatório gerenciado ou nativo.Choose a snapshot in the Compare To list of a managed or native report.

    Escolha um instantâneo da lista comparar comChoose a snapshot from the Compare To list

O relatório de comparação adiciona colunas (marcadas com (Diff)) ao relatório base que mostra a diferença entre o valor do instantâneo base e o do instantâneo de comparação.The change report adds columns (marked with (Diff)) to the base report that show the difference between the base snapshot value and the comparison snapshot. Veja como pode ser a aparência de um relatório de comparação Exibição de Tipo Nativo:Here's how a Native Type View diff report might look:

Exibição de comparação de tipos nativosNative Types Diff View

Blogs e vídeosBlogs and videos

Analisar a CPU e a memória durante a depuraçãoAnalyze CPU and Memory While Debugging

Visual C++ Blog: Memory Profiling in Visual C++ 2015 (Blog do Visual C++: Criação de perfil de memória no Visual C++ 2015)Visual C++ Blog: Memory Profiling in Visual C++ 2015

Próximas etapasNext steps

Neste tutorial, você aprendeu como coletar e analisar dados de uso da memória.In this tutorial, you've learned how to collect and analyze memory usage data. Se você já concluiu o tour do criador de perfil, obtenha uma visão geral de como analisar o uso de CPU em seus aplicativos.If you already completed the tour of the profiler, you may want to get a quick look at how to analyze CPU usage in your apps.