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:
Open een project in Visual Studio.
Het hulpprogramma Geheugengebruik ondersteunt .NET-, ASP.NET-, C++- of gemengde modus-apps (.NET en systeemeigen).
Stel in het menu Foutopsporing de configuratie van de oplossing in op Release- en selecteer Lokaal Windows-foutopsporingsprogramma (of lokale machine) als het implementatiedoel.
Selecteer in de menubalk Foutopsporing>Prestatieprofiler.
Selecteer onder Beschikbare Hulpprogramma'sde optie Geheugengebruiken selecteer daarna Start.
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.
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.
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.
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:
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.
Voor C++heeft de kolom Objecten (Diff) de naam Toewijzingen (Diff).
Beeld | Beschrijving |
---|---|
![]() |
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. |
![]() |
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. |
![]() |
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. |
![]() |
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. |
Beeld | Beschrijving |
---|---|
![]() |
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. |
![]() |
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. |
![]() |
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. |
![]() |
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.
Notitie
Voor .NET-code is het pictogram Exemplaren weergeven () 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.
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.
De -verwijzingsboom toont de verwijzingen die worden vastgehouden door het type dat in het bovenste paneel is geselecteerd.
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.
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.)
Kies het pictogram 'instances' (
) 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.
Kies stapelweergave in de lijst voor weergavemodus om de toewijzingsstapel voor het geselecteerde type weer te geven.
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.
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.
Verschilrapporten
Kies de link wijzigen in een cel van het deelvenster Momentopname op de overzichtspagina Geheugengebruik.
Kies een momentopname in de Vergelijk met lijst met een beheerd of systeemeigen rapport.
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:
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).