Analysera minnesanvändning i versionsversioner (C#, Visual Basic, C++, F#)
Verktyget Minnesanvändning övervakar appens minnesanvändning. Du kan använda verktyget för att studera minneseffekterna i realtid av scenarier som du aktivt utvecklar i Visual Studio. Du kan ta detaljerade ögonblicksbilder av appens minnestillstånd och jämföra ögonblicksbilder för att hitta de bakomliggande orsakerna till minnesproblem. Verktyget Minnesanvändning stöds i appar för .NET, ASP.NET, C++eller blandat läge (.NET och inbyggt).
Verktyget Minnesanvändning kan köra vid versions- eller felsökningsversioner. I den här artikeln visar vi hur du använder verktyget Minnesanvändning i Visual Studio Performance Profiler, vilket rekommenderas för produktionsversioner. Information om hur du väljer det bästa minnesanalysverktyget för dina behov finns i Välj ett verktyg för minnesanalys.
Diagnostiksessioner för minnesanvändning
Starta en minnesanvändningsdiagnostiksession:
Öppna ett projekt i Visual Studio.
Verktyget Minnesanvändning stöder appar för .NET, ASP.NET, C++eller blandat läge (.NET och inbyggt).
I felsökningsmenyn anger du lösningskonfigurationen till Release och väljer Local Windows Debugger (eller Local Machine) som distributionsmål.
På menyraden väljer du Felsöka>Performance Profiler.
Under Tillgängliga verktygväljer du Minnesanvändningoch väljer sedan Starta.
Övervaka minnesanvändning
När du startar en diagnostiksession startar appen och fönstret Diagnostikverktyg visar en tidslinjediagram över appens minnesanvändning.
Tidslinjediagrammet visar minnesfluktuationer när appen körs. Toppar i diagrammet indikerar vanligtvis att viss kod samlar in eller skapar data och sedan tar bort dem när bearbetningen är klar. Stora toppar indikerar områden som du kan optimera. Det viktigaste är en ökning av minnesförbrukningen som inte returneras. Detta kan tyda på ineffektiv minnesanvändning eller till och med en minnesläcka.
Ta ögonblicksbilder av appminnestillstånd
En app använder ett stort antal objekt och du kanske vill koncentrera analysen på ett scenario. Eller så kan det uppstå minnesproblem att undersöka. Du kan ta ögonblicksbilder under en diagnostiksession för att samla in minnesanvändning vid vissa tidpunkter. Det är bra att få en baslinjeögonblicksbild av en app innan ett minnesproblem uppstår. Du kan ta en ny ögonblicksbild efter den första förekomsten av problemet och ytterligare ögonblicksbilder om du kan upprepa scenariot.
Om du vill samla in ögonblicksbilder väljer du Ta ögonblicksbild när du vill samla in minnesdata.
Stäng diagnostiksessionen
Om du vill stoppa en övervakningssession utan att skapa en rapport stänger du bara diagnostikfönstret. Om du vill generera en rapport när du är klar med insamlingen eller har tagit ögonblicksbilder väljer du Stoppa samling.
Om du har problem med att samla in eller visa data kan du läsa Felsöka profileringsfel och åtgärda problem.
Rapporter om minnesanvändning
När du har stoppat datainsamlingen stoppar verktyget minnesanvändning appen och visar översiktssidan Minnesanvändning.
Ögonblicksbilder av minnesanvändning
Siffrorna i fönstret Ögonblicksbild visar objekt och byte i minnet när varje ögonblicksbild togs och skillnaden mellan ögonblicksbilden och den föregående.
Siffrorna är länkar som öppnar detaljerade minnesanvändning rapportvyer i nya Visual Studio-fönster. En rapport med information om ögonblicksbilder visar typerna och instanserna i en ögonblicksbild. En jämförelserapport av skillnader i ögonblicksbilder jämför typerna och instanserna i två ögonblicksbilder.
För C++ är kolumnen Objects (Diff) namngiven som Allocations (Diff).
Bild | Beskrivning |
---|---|
Det totala antalet objekt i minnet när ögonblicksbilden togs. Välj den här länken om du vill visa en rapport om ögonblicksbildsinformation sorterad efter antalet instanser av typerna. | |
Skillnaden mellan det totala antalet minnesobjekt i den här ögonblicksbilden och den tidigare ögonblicksbilden. Välj den här länken om du vill visa en rapport för ögonblicksbildsdiff sorterad efter skillnaden i det totala antalet instanser av typerna. | |
Det totala antalet byte i minnet när ögonblicksbilden togs. Välj den här länken om du vill visa en rapport om ögonblicksbildsinformation sorterad efter den totala storleken på typinstanserna. | |
Skillnaden mellan den totala storleken på minnesobjekt i den här ögonblicksbilden och den tidigare ögonblicksbilden. Ett positivt tal innebär att minnesstorleken för den här ögonblicksbilden är större än den tidigare, och ett negativt tal innebär att storleken är mindre. Baseline innebär att en ögonblicksbild är den första i en diagnostiksession. Ingen skillnad innebär att skillnaden är noll. Välj den här länken om du vill visa en ögonblicksbilds-diffrapport sorterad efter skillnaden i den totala storleken på instanser av typerna. |
Bild | Beskrivning |
---|---|
Det totala antalet byte i minnet när ögonblicksbilden togs. Välj den här länken om du vill visa en rapport om ögonblicksbildsinformation sorterad efter den totala storleken på typinstanserna. | |
Det totala antalet objekt i minnet när ögonblicksbilden togs. Välj den här länken om du vill visa en rapport om ögonblicksbildsinformation sorterad efter antalet instanser av typerna. | |
Skillnaden mellan den totala storleken på minnesobjekt i den här ögonblicksbilden och den tidigare ögonblicksbilden. Ett positivt tal innebär att minnesstorleken för den här ögonblicksbilden är större än den tidigare, och ett negativt tal innebär att storleken är mindre. Baseline innebär att en ögonblicksbild är den första i en diagnostiksession. Ingen skillnad innebär att skillnaden är noll. Välj den här länken om du vill visa en ögonblicksbilds-diffrapport sorterad efter skillnaden i den totala storleken på instanser av typerna. | |
Skillnaden mellan det totala antalet minnesobjekt i den här ögonblicksbilden och den tidigare ögonblicksbilden. Välj den här länken för att visa en översiktsdiff-rapport. Den sorteras efter skillnaden i det totala antalet instanser av typerna. |
Rapporter för hanterade typer
Välj den aktuella länken för en objekt (Diff)-cell i minnesanvändningens sammanfattningstabell.
Anteckning
För .NET-kod är ikonen View Instances () endast tillgänglig när du använder verktyget felsökningsintegrerat minnesanvändning eller när du öppnar en heap-ögonblicksbild och väljer Felsöka hanterat minne.
Det övre fönstret visar antalet och storleken på typerna i ögonblicksbilden, inklusive storleken på alla objekt som refereras till av typen (Inkluderande storlek).
I Sökvägar till rot- träd i det nedre fönstret visas de objekt som refererar till den typ som valts i det övre fönstret. .NET-skräpinsamlaren rensar bara minnet för ett objekt när den sista typen som refererar till det har släppts. Mer information om hur du använder sökvägar till rotträdet finns i Analysera frekvent sökväg till rot.
Det övre fönstret visar antalet och storleken på typerna i ögonblicksbilden, inklusive storleken på alla objekt som refereras till av typen (Inkluderande storlek).
I Sökvägar till rot- träd i det nedre fönstret visas de objekt som refererar till den typ som valts i det övre fönstret. .NET-skräpinsamlaren rensar bara minnet för ett objekt när den sista typen som refererar till det har släppts.
Trädvyn Refererade typer visar de referenser som innehas av den typ som valts i den övre panelen.
Trädvyn Refererade typer visar de referenser som innehas av den typ som valts i den övre panelen.
Filter för rapportträd
Många typer i appar krävs inte för att apputvecklare ska kunna undersöka minnesproblem. Rapportfiltren för ögonblicksbilder kan dölja de flesta av dessa typer i hanterat minne och sökvägar till rot- träd.
Om du vill filtrera ett träd efter typnamn anger du namnet i rutan Filter. Filtret är inte skiftlägeskänsligt och identifierar den angivna strängen i någon del av typnamnet.
Välj Visa bara min kod i listrutan Filter för att dölja de flesta instanser som genereras av extern kod. Externa typer tillhör operativsystemet eller ramverkskomponenterna, eller genereras av kompilatorn.
Välj Dölj små objekt i listrutan Filter för att dölja typer vars storlek (byte) är mindre än 0,5 procent av det totala minnet.
Rapporter för ursprungliga typer
Välj den aktuella länken för en Allokering (Diff) eller Heapstorlek (Diff) cell i sammanfattningstabellen över minnesanvändning i fönstret Diagnostikverktyg.
Typervyn visar antalet och storleken på typerna i ögonblicksbilden.
Välj ikonen Visa instanser bredvid en vald typ för att visa information om objekt av den valda typen i ögonblicksbilden.
Vyn instanser visar varje instans av den valda typen. Om du väljer en instans visas anropsstacken som resulterade i att instansen skapades i fönstret Allokeringsanropsstacken. (Den här informationen är endast tillgänglig vid felsökning.)
Välj instansikonen () av en vald typ för att visa information om objekt av den valda typen i ögonblicksbilden.
Vyn instanser visar varje instans av den valda typen. Om du väljer en instans visas anropsstacken som resulterade i att instansen skapades i fönstret Allokeringsanropsstacken.
Välj Stacks View i listan View Mode för att se allokeringsstacken för den valda typen.
Insikter om minnesanvändning
För hanterat minne ger verktyget Minnesanalys också flera kraftfulla inbyggda automatiska insikter. Välj fliken Insikter i rapporterna Hanterade typer, som visar tillämpliga automatiska insikter som Duplicerade strängar, Glesa matriseroch Läckor i händelsehanterare.
Avsnittet Duplicerade strängar visar listan över strängar som allokeras flera gånger i heap-minnet. Dessutom visar det här avsnittet det totala bortkastade minnet, dvs. (antalet instanser - 1) gånger storleken på strängen.
Avsnittet Sparse Arrays visar matriser som mestadels är fyllda med noll element, vilket kan vara ineffektivt när det gäller prestanda och minnesanvändning. Minnesanalysverktyget identifierar automatiskt dessa matriser och visar hur mycket minne som slösas bort på grund av dessa nollvärden.
Avsnittet Event Handler Leaks, som finns i Visual Studio 2022 version 17.9 Preview 1, visar potentiella minnesläckor som kan uppstå när ett objekt prenumererar på ett annat objekts händelse. Om utgivaren av händelsen överlever prenumeranten förblir prenumeranten vid liv, även om det inte finns några andra referenser till den. Detta kan leda till minnesläckor, där oanvänt minne inte frigörs korrekt, vilket gör att programmet använder mer och mer minne över tid.
Vissa typer är kända för att ha fält som kan läsas för att fastställa storleken på det interna minnet som de håller fast vid. Fliken Insights visar falska interna minnesnoder i objektdiagrammet, som behålls av sina överordnade objekt så att användargränssnittet känner igen dem och visar deras storlek och referensdiagram.
Rapportering av förändringar (Diff)
Välj ändringslänken i en cell i fönstret Ögonblicksbild på sidan för översikten av minnesanvändning.
Välj en ögonblicksbild i listan Jämför med över en hanterad eller inbyggd rapport.
Ändringsrapporten lägger till kolumner (markerade med (Diff)) i basrapporten som visar skillnaden mellan basögonblicksbildens värde och jämförelseögonblicksbilden. Så här skulle en diffrapport för ursprunglig typvy se ut:
Det övre fönstret visar antalet och storleken på typerna i ögonblicksbilden, inklusive storleken på alla objekt som refereras till av typen (Inkluderande storlek).