Dela via


Mäta minnesanvändning i Visual Studio (C#, Visual Basic, C++, F#)

Hitta minnesläckor och ineffektivt minne när du felsöker med det felsökningsintegrerade minnesanvändning diagnostikverktyget. Med verktyget Minnesanvändning kan du ta en eller flera ögonblicksbilder av den hanterade och interna minneshögen för att förstå minnesanvändningens inverkan på objekttyper. Du kan också analysera minnesanvändningen utan ett felsökningsprogram kopplat eller genom att rikta in dig på en app som körs. Mer information finns i Använd profileringsverktyg på release- eller debuggarbyggen. Information om hur du väljer det bästa minnesanalysverktyget för dina behov finns i Välj ett verktyg för minnesanalys.

Även om du kan samla in minnesögonblicksbilder när som helst i verktyget Minnesanvändning kan du använda Visual Studio-felsökningsprogrammet för att styra hur programmet körs när du undersöker prestandaproblem. Genom att ställa in brytpunkter, stega genom, Bryt allt och andra felsökningsåtgärder kan du fokusera på de mest relevanta kodvägarna i dina prestandaundersökningar. Om du utför dessa åtgärder medan appen körs kan du eliminera bruset från koden som inte intresserar dig och avsevärt minska den tid det tar att diagnostisera ett problem.

Viktig

De felsökningsintegrerade diagnostikverktygen stöds för .NET-utveckling i Visual Studio, inklusive ASP.NET, ASP.NET Core, intern/C++-utveckling och appar för blandat läge (.NET och internt).

I den här handledningen kommer du att:

  • Ta ögonblicksbilder av minnet
  • Analysera minnesanvändningsdata

Om minnesanvändning inte ger dig de data som du behöver, tillhandahåller andra profileringsverktyg i Performance Profiler olika typer av information som kan vara till hjälp för dig. I många fall kan prestandaflaskhalsen i ditt program orsakas av något annat än ditt minne, till exempel CPU, återgivningsgränssnitt eller tid för nätverksbegäran.

Not

Support för anpassad minnesallokering Den inbyggda minnesprofileraren fungerar genom att samla in ETW- händelsedata som genereras under körning. Allokerare i CRT och Windows SDK har kommenterats på källnivå så att deras allokeringsdata kan samlas in. Om du skriver egna allokerare kan vilka funktioner som helst som returnerar en pekare till nyligen allokerat heap-minne dekoreras med __declspec(allokerare), som du ser i det här exemplet för myMalloc:

__declspec(allocator) void* myMalloc(size_t size)

Samla in minnesanvändningsdata

  1. Öppna projektet som du vill felsöka i Visual Studio och ange en brytpunkt i din app vid den punkt där du vill börja undersöka minnesanvändningen.

    Om du har ett område där du misstänker ett minnesproblem anger du den första brytpunkten innan minnesproblemet uppstår.

    Tips

    Eftersom det kan vara svårt att avbilda minnesprofilen för en åtgärd som intresserar dig när din app ofta allokerar och avallokerar minne, anger du brytpunkter i början och slutet av åtgärden (eller går igenom åtgärden) för att hitta exakt den punkt då minnet ändrades.

  2. Ange en andra brytpunkt i slutet av den funktion eller region med kod som du vill analysera (eller efter att ett misstänkt minnesproblem inträffar).

  3. Fönstret Diagnostikverktyg visas automatiskt om du inte har inaktiverat det. Om du vill öppna fönstret igen klickar du på Felsöka>Windows>Visa diagnostikverktyg.

  4. Välj minnesanvändning med inställningen Välj verktyg i verktygsfältet.

    skärmbild av diagnostikverktyg.

    skärmbild av diagnostikverktyg.

  5. Klicka på Felsöka/Starta felsökning (eller Starta i verktygsfältet eller F5).

    När appen har laddats klart visas diagnostikverktygens sammanfattningsvy.

    skärmbild av fliken Sammanfattning av diagnostikverktyg.

    Not

    Eftersom insamling av minnesdata kan påverka felsökningsprestandan för dina interna appar eller appar i blandat läge inaktiveras minnesögonblicksbilder som standard. Om du vill aktivera ögonblicksbilder i interna appar eller appar i blandat läge startar du en felsökningssession (genvägsnyckel: F5). När fönstret Diagnostikverktyg visas, väljer du fliken Minnesanvändning och därefter Heap-profilering.

    Skärmbild av Aktivera ögonblicksbilder.

    Stoppa (genvägsnyckel: Skift+F5) och starta om felsökning.

    skärmbild av fliken Sammanfattning av diagnostikverktyg.

    Not

    Eftersom insamling av minnesdata kan påverka felsökningsprestandan för dina interna appar eller appar i blandat läge inaktiveras minnesögonblicksbilder som standard. Om du vill aktivera ögonblicksbilder i interna appar eller appar i blandat läge startar du en felsökningssession (genvägsnyckel: F5). När fönstret Diagnostikverktyg visas väljer du fliken Minnesanvändning och sedan väljer du Heap-Profilering.

    Skärmbild av Aktivera ögonblicksbilder.

    Stoppa (genvägsnyckel: Skift+F5) och starta om felsökning.

  6. Om du vill ta en ögonblicksbild i början av felsökningssessionen väljer du Ta ögonblicksbild i verktygsfältet Minnesanvändning sammanfattning. (Det kan också hjälpa dig att ange en brytpunkt här.)

    Skärmbild av knappen Ta ögonblicksbild.

    Skärmbild av knappen Ta ögonblicksbild.

    Tips

    Om du vill skapa en baslinje för minnesjämförelser bör du överväga att ta en ögonblicksbild i början av felsökningssessionen.

  7. Kör scenariot som gör att din första brytpunkt aktiveras.

  8. När felsökningsprogrammet pausas vid den första brytpunkten väljer du Ta ögonblicksbild i verktygsfältet Minnesanvändning sammanfattning.

  9. Tryck på F5 för att köra appen till din andra brytpunkt.

  10. Ta nu en ny ögonblicksbild.

    Nu kan du börja analysera data.

    Om du har problem med att samla in eller visa data kan du läsa Felsöka profileringsfel och åtgärda problem.

Analysera minnesanvändningsdata

Raderna i tabellen Minnesanvändningssammanfattning visar de ögonblicksbilder som du har tagit under felsökningssessionen och innehåller länkar till mer detaljerade vyer.

Skärmbild av tabellen Minnesanvändning.

Skärmbild av tabellen Minnesanvändning.

Namnet på kolumnen beror på vilket felsökningsläge du väljer i projektegenskaperna: .NET, native eller mixed (både .NET och native).

  • Kolumnen Objects (Diff) (.NET) eller Allocations (Diff) (C++) visar antalet objekt i .NET eller det interna minnet när ögonblicksbilden togs.

  • Kolumnen Heap Size (Diff) visar antalet byte i .NET och interna heaps

När du har tagit flera ögonblicksbilder innehåller cellerna i sammanfattningstabellen ändringen i värdet mellan radögonblicksbilden och den tidigare ögonblicksbilden.

Om du vill analysera minnesanvändningen klickar du på en av länkarna som öppnar en detaljerad rapport om minnesanvändning:

  • Om du vill visa information om skillnaden mellan den aktuella ögonblicksbilden och den föregående ögonblicksbilden väljer du ändringslänken till vänster om pilen (Minnesanvändningsökning). En röd pil anger en ökning av minnesanvändningen och en grön pil anger en minskning.

Tips

För att hjälpa dig att identifiera minnesproblem snabbare sorteras diffrapporterna efter objekttyper som ökade mest i det totala antalet (klicka på ändringslänken i Objekt (Diff) kolumn) eller som ökade mest i total heapstorlek (klicka på ändringslänken i Heap Size (Diff) kolumn).

  • Om du bara vill visa information om den valda ögonblicksbilden klickar du på länken icke-ändra.

    Rapporten visas i ett separat fönster.

Rapporter för hanterade typer

Välj den nuvarande länken för en objekt (Diff) cell i sammanfattningstabellen för minnesanvändning.

Skärmbild av hanterad typrapport.

Notera

För .NET-kod är ikonen View Instances (Instansikonen i kolumnen Objekttyp) 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 trädet Sökvägar till rot 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.

Skärmbild av rapport av hanterad typ.

Det övre fönstret visar antalet och storleken på typerna i ögonblicksbilden, inklusive storleken på alla objekt som refereras till av typen (Inkluderande storlek).

Trädet Sökvägar till rot i det nedre fönstret visar 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ädet Refererade typer visar de referenser som innehas av den typ som valts i det övre fönstret.

Skärmbild av rapporten Refererade objekt.

Trädet Refererade typer visar de referenser som innehas av den typ som valts i det övre fönstret.

Skärmbild av rapporten Refererade objekt.

Om du vill visa instanserna av en vald typ i det övre fönstret klickar du på ikonen Visa instanser bredvid objekttypen.

Skärmbild av vyn Instanser i verktyget Minnesanvändning.

Vyn Instanser visar instanserna av det markerade objektet i ögonblicksbilden i det övre fönstret. Fönstret Sökvägar till rot- och refererade objekt visar de objekt som refererar till den valda instansen och de typer som den valda instansen refererar till. När felsökningsprogrammet stoppas vid den tidpunkt då ögonblicksbilden togs kan du hovra över cellen Value för att visa objektets värden i ett verktygstips.

Skärmbild av vyn Instanser i verktyget Minnesanvändning.

Vyn Instanser visar instanserna av det markerade objektet i ögonblicksbilden i det övre fönstret. Fönstret Sökvägar till rot- och refererade objekt visar de objekt som refererar till den valda instansen och de typer som den valda instansen refererar till. När felsökningsprogrammet stoppas vid den tidpunkt då ögonblicksbilden togs kan du hovra över cellen Value för att visa objektets värden i ett verktygstips.

Rapporter för inbyggda typer

Välj den aktuella länken för en allokering (Diff) eller en heap-storlek (Diff) cell i tabellen för sammanfattning av minnesanvändning i fönstret Diagnostikverktyg.

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

    Skärmbild av instansvyn och Allokeringssamtalsstack-fönstret.

  • Välj instansikonen (Instansikonen i kolumnen Objekttyp) 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.

    Skärmbild av vyn Instanser och rutan Allokeringssamtalsstack.

  • Välj Stacks för att se allokeringsstacken för den valda typen.

    Skärmbild av stackvyn.

  • Välj Stacks View i listan View Mode för att se allokeringsstacken för den valda typen.

    En skärmbild av stackvyn.

Insikter om minnesanvändning

För hanterat minne ger verktyget Minnesanalys också flera kraftfulla inbyggda automatiska insikter. Välj fliken Insights i rapporterna för hanterade typer, och den visar tillämpliga automatiska insikter som Duplicerade strängar, Glesa matriseroch Läckor i händelsehanterare.

Skärmbild av insiktsvyn i verktyget Minnesanvändning.

Avsnittet Duplicerade strängar visar en lista över strängar som allokeras flera gånger på heap. 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.

Skärmbild av den interna insiktsvyn i verktyget Minnesanvändning.

Ändra rapporter (Diff)

  • Välj ändringslänken i en cell i sammanfattningstabellen på fliken Minnesanvändning i fönstret Diagnostikverktyg.

    Skärmbild av Välj en ändringslänk i en cell.

    Skärmbild av Välj en ändringslänk i en cell.

  • Välj en ögonblicksbild i Jämför med lista över en hanterad eller intern rapport.

    Skärmbild av Välj en ögonblicksbild från Jämför med-listan.

    Skärmbild av att välja en ögonblicksbild från Jämför med-listan.

Ä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 kan en diffrapport för inbyggd typvy se ut:

Skärmbild av Diff-vy för ursprungliga typer.

Det övre fönstret visar antalet och storleken på typerna i ögonblicksbilden, inklusive storleken på alla objekt som refereras till av typen (Inkluderande storlek).

Bloggar och videor

Analysera processor och minne vid felsökning

Visual C++ Blogg: Minnesprofilering i Visual C++ 2015

Nästa steg

I den här självstudien har du lärt dig hur du samlar in och analyserar minnesanvändningsdata. Om du redan har slutfört genomgången av profilerarenkanske du vill läsa om en allmän metod för att optimera kod med hjälp av profileringsverktygen.

I den här självstudien har du lärt dig hur du samlar in och analyserar minnesanvändningsdata vid felsökning. Du kanske vill veta mer om hur du analyserar minnesanvändning i versionsversioner med hjälp av Performance Profiler.