Delen via


Geheugengebruik analyseren in releaseversies (C#, Visual Basic, C++, F#)

Het hulpprogramma Geheugengebruik bewaakt het geheugengebruik van uw app. U kunt het hulpprogramma gebruiken om de realtime geheugeneffecten te bestuderen van scenario's die u actief ontwikkelt in Visual Studio. U kunt gedetailleerde momentopnamen van de geheugenstatussen van de app maken en momentopnamen vergelijken om de hoofdoorzaken van geheugenproblemen te vinden. Het hulpprogramma Geheugengebruik wordt ondersteund voor .NET-, ASP.NET-, C++- of gemengde modus-apps (.NET en systeemeigen).

Het hulpprogramma Geheugengebruik kan uitvoeren op release- of debug-builds. In dit artikel laten we zien hoe u het hulpprogramma Geheugengebruik gebruikt in de Visual Studio Performance Profiler-. Dit wordt aanbevolen voor release-builds. Zie Een hulpprogramma voor geheugenanalyse kiezenvoor meer informatie over het kiezen van het beste hulpprogramma voor geheugenanalyse.

Voor de beste ervaring met deze documentatie kiest u de gewenste ontwikkeltaal of runtime in de lijst bovenaan het artikel.

Sessies voor geheugendiagnostiek

Een diagnostische sessie voor geheugengebruik starten:

  1. Open een project in Visual Studio.

    Het hulpprogramma Geheugengebruik ondersteunt .NET-, ASP.NET-, C++- of gemengde modus-apps (.NET en systeemeigen).

  2. Stel in het menu Foutopsporing de configuratie van de oplossing in op Release- en selecteer Lokaal Windows-foutopsporingsprogramma (of lokale machine) als het implementatiedoel.

  3. Selecteer in de menubalk Foutopsporing>Prestatieprofiler.

  4. Selecteer onder Beschikbare Hulpprogramma'sde optie Geheugengebruiken selecteer daarna Start.

    een diagnostische sessie voor geheugengebruik starten.

Geheugengebruik bewaken

Wanneer u een diagnostische sessie start, wordt uw app gestart en wordt in het venster Diagnostische hulpprogramma's een tijdlijngrafiek weergegeven van het geheugengebruik van uw app.

Schermopname van het venster Diagnostische hulpprogramma's in Visual Studio Performance Profiler met een tijdlijn grafiek van het geheugengebruik van de app. Overzicht van het geheugenrapport

In de tijdlijngrafiek ziet u geheugenschommelingen terwijl de app wordt uitgevoerd. Pieken in de grafiek geven meestal aan dat bepaalde code gegevens verzamelt of maakt en deze vervolgens negeert wanneer de verwerking is voltooid. Grote pieken geven gebieden aan die u kunt optimaliseren. De belangrijkste zorg is een toename van het geheugenverbruik dat niet wordt teruggegeven. Dit kan duiden op inefficiënt geheugengebruik of zelfs een geheugenlek.

Momentopnamen van app-geheugenstatussen maken

Een app maakt gebruik van een groot aantal objecten en u kunt uw analyse op één scenario concentreren. Of u kunt geheugenproblemen ontdekken die onderzocht moeten worden. U kunt momentopnamen maken tijdens een diagnostische sessie om het geheugengebruik op bepaalde momenten vast te leggen. Het is goed om een basis momentopname van een app te maken voordat er een geheugenprobleem optreedt. U kunt nog een momentopname maken na het eerste probleem en extra momentopnamen als u het scenario kunt herhalen.

Als u momentopnamen wilt verzamelen, selecteert u Momentopname maken wanneer u de geheugengegevens wilt vastleggen.

Schermopname van het maken van een momentopname.

De diagnostische sessie sluiten

Als u een bewakingssessie wilt stoppen zonder een rapport te maken, sluit u het diagnostische venster. Als u een rapport wilt genereren wanneer u klaar bent met het verzamelen of maken van momentopnamen, selecteert u Verzameling stoppen.

Schermopname van het stoppen van de verzameling.

Schermopname van het stoppen van de verzameling.

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

Rapporten over geheugengebruik

Nadat u het verzamelen van gegevens hebt gestopt, stopt de app met behulp van de Geheugengebruik tool en wordt de overzichtspagina Geheugengebruik weergegeven.

nl-NL: Schermopname van de overzichtspagina in het hulpprogramma Geheugengebruik in Visual Studio Performance Profiler, met een grafiek voor geheugengebruik en twee deelvensters voor momentopnamen.

Schermafbeelding van de overzichtspagina in het hulpprogramma Geheugengebruik in de Visual Studio Performance Profiler, waarbij een grafiek voor geheugengebruik en twee vensters met momentopnamen worden weergegeven.

Momentopnamen van geheugengebruik

De getallen in de momentopname deelvensters geven de objecten en bytes in het geheugen weer wanneer elke momentopname werd gemaakt, en het verschil tussen de momentopname en de vorige.

De getallen zijn koppelingen die gedetailleerde geheugengebruik rapportweergaven openen in nieuwe Visual Studio-vensters. Een rapport met details van momentopnamen toont de typen en exemplaren in één momentopname. Een momentopnamen verschilrapport (diff) vergelijkt de typen en exemplaren in twee momentopnamen.

schermopname van koppelingen naar momentopnameweergaven

Voor C++heeft de kolom Objecten (Diff) de naam Toewijzingen (Diff).

Beeld Beschrijving
stap 1 Het totale aantal objecten in het geheugen toen de momentopname werd gemaakt. Selecteer deze koppeling om een rapport met momentopnamedetails weer te geven, gesorteerd op het aantal exemplaren van de typen.
stap 2 Het verschil tussen het totale aantal geheugenobjecten in deze momentopname en de vorige momentopname. Selecteer deze koppeling om een diff-rapport voor momentopnamen weer te geven, gesorteerd op het verschil in het totale aantal exemplaren van de typen.
stap 3 Het totale aantal bytes in het geheugen toen de momentopname werd gemaakt. Selecteer deze koppeling om een rapport met momentopnamegegevens weer te geven, gesorteerd op de totale grootte van de typeexemplaren.
stap 4 Het verschil tussen de totale grootte van geheugenobjecten in deze momentopname en de vorige momentopname. Een positief getal betekent dat de geheugengrootte van deze momentopname groter is dan de vorige en een negatief getal betekent dat de grootte kleiner is. Basislijn betekent dat een momentopname de eerste is in een diagnostische sessie. Geen verschil betekent dat het verschil nul is. Selecteer deze koppeling om een diff-rapport voor momentopnamen weer te geven, gesorteerd op het verschil in de totale grootte van exemplaren van de typen.

koppelingen naar momentopnameweergaven

Beeld Beschrijving
stap 1 Het totale aantal bytes in het geheugen toen de momentopname werd gemaakt. Selecteer deze koppeling om een rapport met momentopnamegegevens weer te geven, gesorteerd op de totale grootte van de typeexemplaren.
stap 2 Het totale aantal objecten in het geheugen toen de momentopname werd gemaakt. Selecteer deze koppeling om een rapport met momentopnamedetails weer te geven, gesorteerd op het aantal exemplaren van de typen.
stap 3 Het verschil tussen de totale grootte van geheugenobjecten in deze momentopname en de vorige momentopname. Een positief getal betekent dat de geheugengrootte van deze momentopname groter is dan de vorige en een negatief getal betekent dat de grootte kleiner is. Basislijn betekent dat een momentopname de eerste is in een diagnostische sessie. Geen verschil betekent dat het verschil nul is. Selecteer deze koppeling om een diff-rapport voor momentopnamen weer te geven, gesorteerd op het verschil in de totale grootte van exemplaren van de typen.
stap 4 Het verschil tussen het totale aantal geheugenobjecten in deze momentopname en de vorige momentopname. Selecteer deze koppeling om een diff-rapport voor momentopnamen weer te geven. Het wordt gesorteerd op het verschil in het totale aantal exemplaren van de typen.

Rapporten van beheerde typen

Kies de huidige koppeling van een Object (Diff) cel in de Geheugengebruik-samenvattingstabel.

Schermopname van het beheerde typerapport.

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.

Het bovenste deelvenster toont het aantal en de grootte van de typen in de momentopname, inclusief de grootte van alle objecten waarnaar het type verwijst (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 garbage-collector schoont het geheugen voor een object alleen op wanneer het laatste type dat ernaar verwijst is opgeheven. Zie Dynamisch pad analyseren naar hoofdmapvoor meer informatie over het gebruik van de paden naar de hoofdstructuur van.

Schermopname van het beheerd 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 door het type wordt verwezen (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 garbagecollection schoont het geheugen voor een object alleen op wanneer het laatste type dat verwijst naar het object is vrijgegeven.

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

Screenshot van het rapport Gerefereerde Objecten.

De -verwijzingsboom toont de verwijzingen die worden vastgehouden door het type dat in het bovenste paneel is geselecteerd.

schermopname van het rapport Verwezen Objecten.

Boomstructuurfilters voor rapporten

Veel typen apps zijn niet vereist voor app-ontwikkelaars om geheugenproblemen te onderzoeken. De rapportfilters voor momentopnamen kunnen de meeste van deze typen verbergen in de beheerde geheugen- en paden naar hoofd--structuren.

sorteer- en filteropties

sorteer- en filteropties

  • Als u een boom wilt filteren op typenaam, typt u de naam in het vak Filter. Het filter is niet hoofdlettergevoelig en herkent de opgegeven tekenreeks in een deel van de typenaam.

  • Selecteer Alleen mijn code weergeven in de vervolgkeuzelijst Filter om de meeste exemplaren te verbergen die door externe code worden gegenereerd. Externe typen behoren tot het besturingssysteem of de frameworkonderdelen of worden gegenereerd door de compiler.

  • Selecteer Kleine objecten samenvouwen in de vervolgkeuzelijst Filter om typen te verbergen waarvan grootte (bytes) kleiner is dan 0,5 procent van het totale geheugen.

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 Typeweergave 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.

    Elk exemplaar van het geselecteerde type wordt weergegeven in de weergave Exemplaren. Wanneer 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 Exemplarenweergave en Toewijzingsaanroepstack.

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

    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 creatie van het exemplaar in het deelvenster Allocation Call Stack.

    Schermopname van de weergave 'Instanties' en het deelvenster 'Toewijzingsaanroepstack'.

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

    schermopname van de stacks-weergave.

  • Kies stapelweergave in de lijst voor weergavemodus om de toewijzingsstapel voor het geselecteerde type weer te geven.

    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 van Beheerde Typen, waar de toepasselijke automatische inzichten worden getoond, zoals Duplicate strings, schaarse arraysen gebeurtenishandlerlekken.

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 weergegeven hoeveel geheugen er in totaal wordt verspild, namelijk: (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 actief, zelfs als er geen andere verwijzingen naar de abonnee 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 natuurlijk 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.

Verschilrapporten

  • Kies de link wijzigen in een cel van het deelvenster Momentopname op de overzichtspagina Geheugengebruik.

    Schermopname van Kies een wijzigingslink in een cel.

    Screenshot van Kies een wijzigingslink in een cel.

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

    Schermopname van Kies een momentopname uit de 'Vergelijken met'-lijst.

    Schermopname van Kies een momentopname uit de Vergelijk-met-lijst.

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:

schermopname 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 waar het type naar verwijst (Inclusieve grootte).