Delen via


Geheugengebruik meten in Visual Studio (C#, Visual Basic, C++, F#)

Vind geheugenlekken en inefficiënt geheugen terwijl u foutopsporing uitvoert met het met het foutopsporingsprogramma geïntegreerde geheugengebruik diagnostisch hulpprogramma. Met het hulpprogramma Geheugengebruik kunt u een of meer momentopnamen maken van de beheerde en systeemeigen geheugen-heap om inzicht te verkrijgen in de impact van het geheugengebruik van objecttypen. U kunt ook geheugengebruik analyseren zonder dat er een foutopsporingsprogramma is gekoppeld of door een actieve app te gebruiken. Voor meer informatie, zie Voer hulpprogramma's voor profilering uit op release- of foutopsporingsbuilds. Zie Een hulpprogramma voor geheugenanalyse kiezenvoor meer informatie over het kiezen van het beste hulpprogramma voor geheugenanalyse.

Hoewel u op elk gewenst moment geheugenmomentopnamen kunt verzamelen in het hulpprogramma Geheugengebruik, kunt u het foutopsporingsprogramma van Visual Studio gebruiken om te bepalen hoe uw toepassing wordt uitgevoerd tijdens het onderzoeken van prestatieproblemen. Als u onderbrekingspunten instelt, stappen doorloopt, Alles stoppen gebruikt en andere debugacties uitvoert, kunt u uw prestatieonderzoek richten op de codepaden die het meest relevant zijn. Door deze acties uit te voeren terwijl uw app wordt uitgevoerd, kan de ruis worden weggenomen van de code die u niet interesseert en kunt u de hoeveelheid tijd die nodig is om een probleem vast te stellen aanzienlijk verminderen.

Belangrijk

De debugger-geïntegreerde diagnostische hulpprogramma's worden ondersteund voor .NET-ontwikkeling in Visual Studio, waaronder ASP.NET, ASP.NET Core, native/C++-ontwikkeling en gemengde modus-apps (zowel .NET als native).

In deze zelfstudie gaat u het volgende doen:

  • Momentopnamen van geheugen maken
  • Geheugengebruiksgegevens analyseren

Als geheugengebruik u niet de gegevens geeft die u nodig hebt, bieden andere profileringshulpprogramma's in de Performance Profiler verschillende soorten informatie die nuttig voor u kan zijn. In veel gevallen kan het prestatieknelpunt van uw toepassing worden veroorzaakt door iets anders dan uw geheugen, zoals CPU, renderinggebruikersinterface of tijd voor netwerkaanvragen.

Notitie

Aangepaste allocator-ondersteuning de systeemeigen geheugenprofielmachine werkt door toewijzing ETW- gebeurtenisgegevens te verzamelen die tijdens de runtime worden verzonden. Toewijzingen in de CRT- en Windows SDK zijn geannoteerd op bronniveau, zodat hun toewijzingsgegevens kunnen worden vastgelegd. Als u uw eigen allocators schrijft, kunnen functies die een aanwijzer retourneren naar nieuw toegewezen heap-geheugen, worden versierd met __declspec(allocator), zoals in dit voorbeeld voor myMalloc:

__declspec(allocator) void* myMalloc(size_t size)

Geheugengebruiksgegevens verzamelen

  1. Open het project dat u wilt opsporen in Visual Studio en stel een onderbrekingspunt in uw app in op het punt waar u wilt beginnen met het onderzoeken van het geheugengebruik.

    Als u een gebied hebt waar u een geheugenprobleem vermoedt, stelt u het eerste onderbrekingspunt in voordat het geheugenprobleem optreedt.

    Tip

    Omdat het lastig kan zijn om het geheugenprofiel vast te leggen van een bewerking die u interesseert wanneer uw app regelmatig geheugen toewijst en het toewijzen van geheugen ongedaan maakt, stelt u onderbrekingspunten in aan het begin en einde van de bewerking (of doorloopt u de bewerking) om het exacte punt te vinden dat het geheugen is gewijzigd.

  2. Stel een tweede onderbrekingspunt in aan het einde van de functie of het codegebied dat u wilt analyseren (of nadat er een verdacht geheugenprobleem optreedt).

  3. Het venster Diagnostische hulpprogramma's wordt automatisch weergegeven, tenzij u het venster hebt uitgeschakeld. Als u het venster opnieuw wilt weergeven, klikt u op Foutopsporing>Windows>Diagnostische hulpprogramma's weergeven.

  4. Kies geheugengebruik met de instelling Select Tools op de werkbalk.

    Schermopname van Diagnostische hulpprogramma's.

    Schermopname van Diagnostische hulpprogramma's.

  5. Klik op Foutopsporing starten (of Start op de werkbalk, of F5).

    Wanneer het laden van de app is voltooid, wordt de overzichtsweergave van de diagnostische hulpprogramma's weergegeven.

    schermopname van het tabblad Overzicht van diagnostische hulpprogramma's.

    Notitie

    Omdat het verzamelen van geheugengegevens van invloed kan zijn op de foutopsporingsprestaties van uw systeemeigen of gemengde apps, worden geheugenmomentopnamen standaard uitgeschakeld. Als u momentopnamen in systeemeigen of gemengde modus-apps wilt inschakelen, start u een foutopsporingssessie (sneltoets: F5). Wanneer het venster Diagnostische hulpprogramma's wordt weergegeven, kiest u het tabblad Geheugengebruik en kiest u vervolgens Heap-profilering.

    Screenshot van Momentopnamen inschakelen.

    Stop (sneltoets: Shift+F5) en start de foutopsporing opnieuw.

    schermopname van het tabblad Overzicht van diagnostische hulpprogramma's.

    Notitie

    Omdat het verzamelen van geheugengegevens van invloed kan zijn op de foutopsporingsprestaties van uw systeemeigen of gemengde apps, worden geheugenmomentopnamen standaard uitgeschakeld. Als u momentopnamen in systeemeigen of gemengde modus-apps wilt inschakelen, start u een foutopsporingssessie (sneltoets: F5). Wanneer het venster Diagnostische hulpprogramma's wordt weergegeven, kiest u het tabblad Geheugengebruik en kiest u vervolgens Heap-profilering.

    Schermopname van momentopnamen inschakelen.

    Stop (sneltoets: Shift+F5) en start de foutopsporing opnieuw.

  6. Als u aan het begin van de foutopsporingssessie een momentopname wilt maken, kiest u Momentopname maken in de samenvatting van de werkbalk Geheugengebruik. (Het kan ook helpen om hier een onderbrekingspunt in te stellen.)

    schermopname van de knop Momentopname maken.

    schermopname van de knop Momentopname maken.

    Tip

    Als u een basislijn voor geheugenvergelijkingen wilt maken, kunt u een momentopname maken aan het begin van uw foutopsporingssessie.

  7. Voer het scenario uit waardoor uw eerste onderbrekingspunt wordt bereikt.

  8. Terwijl de debugger is gepauzeerd bij het eerste onderbrekingspunt, kiest u Momentopname maken op de samenvattingswerkbalk Geheugengebruik.

  9. Druk op F5 om de app door te laten gaan naar het tweede onderbrekingspunt.

  10. Maak nu nog een momentopname.

    Op dit moment kunt u beginnen met het analyseren van de gegevens.

    Zie Profileringsfouten oplossen en problemen oplossenals u problemen ondervindt bij het verzamelen of weergeven van gegevens.

Geheugengebruiksgegevens analyseren

De rijen van de overzichtstabel Geheugengebruik bevatten de momentopnamen die u tijdens de foutopsporingssessie hebt gemaakt en bevatten koppelingen naar meer gedetailleerde weergaven.

schermopname van de tabel Geheugengebruik.

schermopname van de tabel Geheugengebruik.

De naam van de kolom is afhankelijk van de foutopsporingsmodus die u kiest in de projecteigenschappen: .NET, systeemeigen of gemengd (zowel .NET als systeemeigen).

  • In de kolom Objecten (Diff) (.NET) of Toewijzingen (Diff) (C++) wordt het aantal objecten in .NET of native geheugen weergegeven op het moment van de momentopname.

  • In de kolom Heap-grootte (Diff) wordt het aantal bytes weergegeven in de .NET- en native heaps.

Wanneer u meerdere momentopnamen hebt gemaakt, bevatten de cellen van de samenvattingstabel de wijziging in de waarde tussen de momentopname van de rij en de vorige momentopname.

Als u het geheugengebruik wilt analyseren, klikt u op een van de koppelingen waarmee een gedetailleerd rapport van het geheugengebruik wordt geopend:

  • Als u details van het verschil tussen de huidige momentopname en de vorige momentopname wilt bekijken, kiest u de koppeling naar de wijziging links van de pijl (geheugengebruik verhogen). Een rode pijl geeft een toename van het geheugengebruik aan en een groene pijl geeft een afname aan.

Tip

Om geheugenproblemen sneller te identificeren, worden de diff-rapporten gesorteerd op objecttypen die het meest in het totale aantal zijn toegenomen (klik op de koppeling wijzigen in objecten (Diff) kolom) of die het meest in de totale heapgrootte hebben verhoogd (klik op de koppeling wijzigen in heapgrootte (diff) kolom).

  • Als u alleen details van de geselecteerde momentopname wilt weergeven, klikt u op de koppeling die niet is gewijzigd.

    Het rapport wordt weergegeven in een afzonderlijk venster.

Rapporten met beheerde types

Kies de huidige link van een Objecten (Diff) cel in de Geheugengebruik-samenvattingstabel.

Schermopname van het beheerd type rapport.

Notitie

Voor .NET-code is het pictogram Exemplaren weergeven (Het exemplaarpictogram in de kolom Objecttype) alleen beschikbaar tijdens het gebruik van het hulpprogramma voor foutopsporingsprogramma voor geheugengebruik of wanneer u een heap-momentopname opent en Managed Memory-kiest.

In het bovenste paneel ziet u het aantal en de grootte van de typen in de momentopname, inclusief de grootte van alle objecten waarnaar wordt verwezen door het type (Inclusief grootte).

In de paden naar de hoofdstructuur in het onderste deelvenster worden de objecten weergegeven die verwijzen naar het type dat is geselecteerd in het bovenste deelvenster. De .NET garbagecollector schoont het geheugen voor een object alleen op wanneer het laatste type dat ernaar verwijst is vrijgegeven. Zie Dynamisch pad analyseren naar hoofdmapvoor meer informatie over het gebruik van de paden naar de hoofdstructuur van.

Schermopname van het beheerste typerapport.

In het bovenste deelvenster ziet u het aantal en de grootte van de typen in de momentopname, inclusief de grootte van alle objecten waarnaar het type verwijst (Inclusieve grootte).

In de paden naar de hoofdstructuur in het onderste deelvenster worden de objecten weergegeven die verwijzen naar het type dat is geselecteerd in het bovenste deelvenster. De .NET garbagecollector ruimt het geheugen van een object alleen op wanneer het laatste type dat ernaar verwijst is vrijgegeven.

In de boomstructuur Referenced Types worden de verwijzingen weergegeven die worden vastgehouden door het type dat in het bovenste deelvenster is geselecteerd.

schermafbeelding van het rapport over verwezen objecten.

In de Verwijzingstypen-boom worden de verwijzingen weergegeven die worden vastgehouden door het type dat in het bovenste deelvenster is geselecteerd.

Schermopname van het rapport van de gerefereerde objecten.

Als u de exemplaren van een geselecteerd type in het bovenste deelvenster wilt weergeven, klikt u op het pictogram Exemplaren weergeven naast het objecttype.

Schermafbeelding van de weergave

In de weergave Instanties worden de instanties van het geselecteerde object weergegeven in de momentopname in het bovenste paneel. In het deelvenster Paden naar hoofd- en objecten waarnaar wordt verwezen worden de objecten weergegeven die verwijzen naar het geselecteerde exemplaar en de typen waarnaar de geselecteerde instantie verwijst. Wanneer het foutopsporingsprogramma is gestopt op het punt waar de momentopname is gemaakt, kunt u de muisaanwijzer over de waarde cel bewegen om de waarden van het object in een tooltip weer te geven.

schermopname van de weergave Exemplaren in het hulpprogramma Geheugengebruik.

In de weergave Instanties worden de instanties van het geselecteerde object weergegeven in de momentopname in het bovenste deelvenster. In het deelvenster Paden naar root en objecten waarnaar wordt verwezen worden de objecten weergegeven die verwijzen naar de geselecteerde instantie en de typen waarnaar deze instantie verwijst. Wanneer de debugger is gestopt op het punt waar de momentopname is gemaakt, kunt u de muisaanwijzer over de waarde cel bewegen om de waarden van het object in een tooltip weer te geven.

Systeemeigen typen rapporten

Kies de huidige koppeling van een Allocations (Diff) of Heap Size (Diff) cel in de overzichtstabel Geheugengebruik van het venster Diagnostische hulpprogramma's.

In de weergave Typen wordt het aantal en de grootte van de typen in de momentopname weergegeven.

  • Kies het pictogram Exemplaren weergeven naast een geselecteerd type om informatie weer te geven over de objecten van het geselecteerde type in de momentopname.

    In de weergave Exemplaren wordt elk exemplaar van het geselecteerde type weergegeven. Als u een instantie selecteert, wordt de aanroepstack weergegeven die leidde tot de creatie van de instantie in het deelvenster Toewijzingsaanroepstack. (Deze informatie is alleen beschikbaar tijdens foutopsporing.)

    Schermopname van het deelvenster Instantieweergave en Toewijzingsaanroepstapel.

  • Kies het instantiepictogram (Het exemplaarpictogram in de kolom Objecttype) van een geselecteerd type om informatie weer te geven over objecten van het geselecteerde type in de momentopname.

    In de weergave Exemplaren wordt elk exemplaar van het geselecteerde type weergegeven. Als u een exemplaar selecteert, wordt de aanroepstack weergegeven die heeft geleid tot de aanmaak van het exemplaar in het deelvenster Toewijzingsaanroepstack.

    Schermopname van het deelvenster Instantiesweergave en Toewijzingsaanroepstack.

  • Kies Stacks om de allocatiestapel voor het geselecteerde type weer te geven.

    schermopname van de stacks-weergave.

  • Kies Stacks View in de weergavemodus-lijst om de toewijzingsstack voor het geselecteerde type te zien.

    schermopname van de weergave Stacks.

Inzichten in geheugengebruik

Voor beheerd geheugen biedt het hulpprogramma Geheugenanalyse ook meerdere krachtige ingebouwde automatische inzichten. Selecteer het tabblad Insights in de rapporten Beheerde typen, waar de toepasselijke automatische inzichten zoals dubbele tekenreeksen, spaarzame arraysen gebeurtenishandlerlekkenworden getoond.

Schermopname van de inzichtweergave in het hulpprogramma Geheugengebruik. inzicht in geheugengebruik

In de sectie Dubbele tekenreeksen ziet u de lijst met tekenreeksen die meerdere keren worden toegewezen aan de heap. Daarnaast wordt in deze sectie het totale geheugen weergegeven dat wordt verspild, dat wil zeggen: het (aantal instanties - 1) keer de grootte van de tekenreeks.

In de sectie Sparse-matrices worden matrices weergegeven die meestal zijn gevuld met nulelementen, wat inefficiënt kan zijn in termen van prestaties en geheugengebruik. Het hulpprogramma voor geheugenanalyse detecteert deze matrices automatisch en laat zien hoeveel geheugen er wordt verspild vanwege deze nulwaarden.

In de sectie Gebeurtenishandlerlekken, beschikbaar in Visual Studio 2022 versie 17.9 Preview 1, worden mogelijke geheugenlekken weergegeven die kunnen optreden wanneer een object zich abonneert op de gebeurtenis van een ander object. Als de uitgever van de gebeurtenis de abonnee overleeft, blijft de abonnee bestaan, zelfs als er geen andere verwijzingen naar hem zijn. Dit kan leiden tot geheugenlekken, waarbij ongebruikt geheugen niet goed wordt vrijgemaakt, waardoor de toepassing na verloop van tijd meer en meer geheugen gebruikt.

Bepaalde typen hebben velden die kunnen worden gelezen om de grootte van het inheems geheugen te bepalen dat ze vasthouden. Het tabblad Insights toont valse systeemeigen geheugenknooppunten in de objectgrafiek, die worden bewaard door hun bovenliggende objecten, zodat de gebruikersinterface ze herkent en hun grootte en referentiegrafiek weergeeft.

Schermopname van de systeemeigen inzichtweergave in het hulpprogramma Geheugengebruik.

Rapporten met verschillen (Diff)

  • Kies de koppeling wijzigen in een cel van de overzichtstabel van het tabblad Geheugengebruik in het venster Diagnostische hulpprogramma's.

    Schermopname van Kies een wijzigingskoppeling in een cel.

    Schermopname van Kies een wijzigingslink in een cel.

  • Kies een momentopname in de Vergelijken met lijst van een beheerd of systeemeigen rapport.

    schermopname van Een momentopname kiezen in de lijst Vergelijken met.

    Schermopname van

Het wijzigingsrapport voegt kolommen toe (gemarkeerd met (Diff)) aan het basisrapport met het verschil tussen de basismomentopnamewaarde en de vergelijkingsmomentopname. Hier ziet u hoe een diff-rapport van een systeemeigen typeweergave eruit kan zien:

schermafbeelding van de Native Types Diff-weergave.

In het bovenste deelvenster ziet u het aantal en de grootte van de typen in de momentopname, inclusief de grootte van alle objecten waarnaar wordt verwezen door het type (Inclusief formaat).

Blogs en video's

CPU en geheugen analyseren tijdens foutopsporing

Visual C++ Blog: Geheugenprofilering in Visual C++ 2015

Volgende stappen

In deze zelfstudie hebt u geleerd hoe u geheugengebruiksgegevens verzamelt en analyseert. Als u de tour van de profileral hebt voltooid, kunt u lezen over een algemene benadering voor het optimaliseren van code met behulp van de profileringstools.

In deze zelfstudie hebt u geleerd hoe u geheugengebruiksgegevens verzamelt en analyseert tijdens het opsporen van fouten. Mogelijk wilt u meer weten over het analyseren van het geheugengebruik in releaseversies met behulp van de Performance Profiler.