Freigeben über


Analysieren der Speicherauslastung in Releasebuilds (C#, Visual Basic, C++, F#)

Das Werkzeug Speicherauslastung überwacht die Speichernutzung Ihrer App. Sie können das Tool verwenden, um die Echtzeit-Speichereffekte von Szenarien zu untersuchen, die Sie aktiv in Visual Studio entwickeln. Sie können detaillierte Momentaufnahmen der Speicherzustände der App erstellen und Momentaufnahmen vergleichen, um die Ursachen von Speicherproblemen zu finden. Das Speichernutzungstool wird in .NET-, ASP.NET-, C++- oder Gemischtmodus-Apps (.NET und systemeigene) Apps unterstützt.

Das Speicherauslastungstool kann in Release- oder Debugbuilds ausgeführt werden. In diesem Artikel wird gezeigt, wie Sie das Speichernutzungstool in Visual Studio Performance Profilerverwenden, das für Releasebuilds empfohlen wird. Informationen zum Auswählen des besten Speicheranalysetools für Ihre Anforderungen finden Sie unter Auswählen eines Speicheranalysetools.

Um die beste Erfahrung mit dieser Dokumentation zu erzielen, wählen Sie ihre bevorzugte Entwicklungssprache oder Laufzeit aus der Liste oben im Artikel aus.

Diagnosesitzungen zur Speicherauslastung

So starten Sie eine Diagnosesitzung zur Speicherauslastung:

  1. Öffnen Sie ein Projekt in Visual Studio.

    Das Speichernutzungstool unterstützt .NET-, ASP.NET-, C++- oder Gemischtmodus-Apps (.NET und systemeigene Apps).

  2. Legen Sie im Menü "Debuggen" die Lösungskonfiguration auf Release- fest, und wählen Sie lokalen Windows-Debugger- (oder lokalen Computer) als Bereitstellungsziel aus.

  3. Wählen Sie auf der Menüleiste Debug>Performance Profileraus.

  4. Wählen Sie unter Verfügbare ToolsSpeicherauslastungaus, und wählen Sie dann Startaus.

    Starten einer Diagnosesitzung zur Speicherauslastung.

    Starte eine Diagnosesitzung zur Speicherauslastung.

Überwachen der Speichernutzung

Wenn Sie eine Diagnosesitzung starten, wird ihre App gestartet, und das fenster Diagnosetools zeigt ein Zeitachsendiagramm der Speichernutzung Ihrer App an.

Screenshot des Fensters

Screenshot: Fenster „Diagnosetools“ im Visual Studio-Leistungs-Profiler mit einem Zeitachsendiagramm der Speichernutzung der App

Das Zeitachsendiagramm zeigt Speicherschwankungen bei der Ausführung der App an. Spitzen im Diagramm deuten in der Regel darauf hin, dass ein Code Daten sammelt oder erstellt und sie dann verwirft, wenn die Verarbeitung abgeschlossen ist. Große Spitzen geben Bereiche an, die Sie optimieren können. Das Hauptproblem ist ein Anstieg im Arbeitsspeicherverbrauch, der nicht zurückgegeben wird. Dies kann auf ineffiziente Speichernutzung oder sogar einen Speicherverlust hinweisen.

Erstellen von Momentaufnahmen zu Speicherzuständen von Apps

Eine App verwendet eine große Anzahl von Objekten, und Sie können ihre Analyse auf ein Szenario konzentrieren. Oder Sie können Speicherprobleme finden, die untersucht werden sollen. Sie können während einer Diagnosesitzung Momentaufnahmen erstellen, um die Speicherauslastung in bestimmten Momenten zu erfassen. Es ist gut, eine grundlegende Momentaufnahme einer App zu erhalten, bevor ein Speicherproblem auftritt. Sie können nach dem ersten Auftreten des Problems eine weitere Momentaufnahme erstellen und zusätzliche Momentaufnahmen erstellen, wenn Sie das Szenario wiederholen können.

Klicken Sie auf Momentaufnahme erstellen, wenn Sie mit dem Erfassen der Speicherdaten beginnen möchten.

Screenshot der Aufnahme einer Momentaufnahme.

Schließen der Diagnosesitzung

Um eine Überwachungssitzung zu beenden, ohne einen Bericht zu erstellen, schließen Sie einfach das Diagnosefenster. Um einen Bericht zu generieren, wenn Sie mit dem Sammeln oder Erstellen von Momentaufnahmen fertig sind, wählen Sie Beenden der Sammlungaus.

Screenshot: Beenden der Sammlung

Screenshot zum Beenden des Sammlungsprozesses.

Wenn Sie Probleme beim Sammeln oder Anzeigen von Daten haben, lesen Sie Behandeln von Profilerstellungsfehlern und Beheben von Problemen.

Speicherauslastungsberichte

Nachdem Sie die Datensammlung beendet haben, beendet das tool Speicherauslastung die App und zeigt die Übersichtsseite Speicherauslastung an.

Screenshot der Übersichtsseite im

Screenshot der Übersichtsseite im Tool

Momentaufnahmen der Speicherauslastung

In den Bereichen für Momentaufnahmen finden Sie die Anzahl der Bytes und Objekte im Speicher zum Zeitpunkt der Momentaufnahme sowie Zahlen zum Vergleich zwischen der aktuellen und der vorherigen Momentaufnahme.

Die Zahlen sind Links, die detaillierte Speicherauslastung Berichtsansichten in neuen Visual Studio-Fenstern öffnen. In einem Momentaufnahmen-Detailbericht werden die Arten und Instanzen in einer Momentaufnahme aufgeführt. In einem Bericht über Momentaufnahmenunterschiede werden die Typen und Instanzen zweier Momentaufnahmen miteinander verglichen.

Screenshot von Momentaufnahmen-Ansichtsverknüpfungen

Bei C++ heißt die Objekte (Diff.)-Spalte Zuweisungen (Diff.).

Bild Beschreibung
Schritt 1 Die Gesamtanzahl der Objekte im Arbeitsspeicher, wenn die Momentaufnahme erstellt wurde. Wählen Sie diesen Link aus, um einen Momentaufnahmedetails-Bericht anzuzeigen, der nach der Anzahl der Instanzen der Typen sortiert ist.
Schritt 2 Der Unterschied zwischen der Gesamtanzahl der Speicherobjekte in dieser Momentaufnahme und der vorherigen Momentaufnahme. Wählen Sie diesen Link aus, um einen Snapshot-Diff-Bericht anzuzeigen, der nach der Differenz in der Gesamtanzahl der Instanzen der Typen sortiert ist.
Schritt 3 Die Gesamtanzahl der Bytes im Arbeitsspeicher, wenn die Momentaufnahme erstellt wurde. Wählen Sie diesen Link aus, um einen Momentaufnahmedetails-Bericht anzuzeigen, der nach der Gesamtgröße der Typinstanzen sortiert ist.
Schritt 4 Der Unterschied zwischen der Gesamtgröße der Speicherobjekte in dieser Momentaufnahme und der vorherigen Momentaufnahme. Eine positive Zahl bedeutet, dass die Speichergröße dieser Momentaufnahme größer als die vorherige ist, und eine negative Zahl bedeutet, dass die Größe kleiner ist. Wenn der Begriff Baseline angezeigt wird, deutet dies darauf hin, dass es sich um die erste Momentaufnahme in einer Diagnosesitzung handelt. Kein Unterschied bedeutet, dass die Differenz null ist. Wählen Sie diesen Link aus, um einen Snapshot-Diff-Bericht anzuzeigen, der nach dem Unterschied in der Gesamtgröße der Instanzen der Typen sortiert ist.

Momentaufnahmenansicht links

Bild Beschreibung
Schritt 1 Die Gesamtanzahl der Bytes im Arbeitsspeicher, wenn die Momentaufnahme erstellt wurde. Wählen Sie diesen Link aus, um einen Momentaufnahmedetails-Bericht anzuzeigen, der nach der Gesamtgröße der Typinstanzen sortiert ist.
Schritt 2 Die Gesamtanzahl der Objekte im Arbeitsspeicher, wenn die Momentaufnahme erstellt wurde. Wählen Sie diesen Link aus, um einen Momentaufnahmedetails-Bericht anzuzeigen, der nach der Anzahl der Instanzen der Typen sortiert ist.
Schritt 3 Der Unterschied zwischen der Gesamtgröße der Speicherobjekte in dieser Momentaufnahme und der vorherigen Momentaufnahme. Eine positive Zahl bedeutet, dass die Speichergröße dieser Momentaufnahme größer als die vorherige ist, und eine negative Zahl bedeutet, dass die Größe kleiner ist. Wenn der Begriff Baseline angezeigt wird, deutet dies darauf hin, dass es sich um die erste Momentaufnahme in einer Diagnosesitzung handelt. Kein Unterschied bedeutet, dass die Differenz null ist. Wählen Sie diesen Link aus, um einen Snapshot-Diff-Bericht anzuzeigen, der nach dem Unterschied in der Gesamtgröße der Instanzen der Typen sortiert ist.
Schritt 4 Der Unterschied zwischen der Gesamtanzahl der Speicherobjekte in dieser Momentaufnahme und der vorherigen Momentaufnahme. Wählen Sie diesen Link aus, um einen Vergleichsbericht für Momentaufnahmen aufzurufen. Es wird nach der Differenz in der Gesamtanzahl der Instanzen der verschiedenen Typen sortiert.

Berichte zu den verwalteten Typen

Wählen Sie den aktuellen Link einer Objects (Diff) Zelle in der Zusammenfassungstabelle "Speicherauslastung" aus.

Screenshot: Bericht zu verwalteten Typen

Anmerkung

Für .NET-Code ist das Symbol View Instances (Das Instanzsymbol in der Spalte ) nur verfügbar, wenn Sie das debugger-integrierten Speichernutzungstool verwenden oder wenn Sie eine Heap-Momentaufnahme öffnen und Debug Managed Memoryauswählen.

Im oberen Bereich werden Anzahl und Größe der Typen in der Momentaufnahme angezeigt, einschließlich der Größe aller Objekte, auf die der Typ verweist (Umfassende Größe).

Die Struktur Pfade zum Stamm im unteren Bereich zeigt die Objekte an, die auf den im oberen Bereich ausgewählten Typ verweisen. Der .NET Garbage Collector bereinigt den Speicher für ein Objekt nur, wenn der letzte Typ, der darauf verweist, freigegeben wurde. Weitere Informationen zur Verwendung der Struktur Pfade zum Stamm finden Sie unter Analysieren des langsamsten Pfads zum Stamm.

Screenshot: Bericht zu verwalteten Typen.

Im oberen Bereich werden Anzahl und Größe der Typen in der Momentaufnahme angezeigt, einschließlich der Größe aller Objekte, auf die der Typ verweist (Inklusive Größe).

Die Struktur Pfade zum Stamm im unteren Bereich zeigt die Objekte an, die auf den im oberen Bereich ausgewählten Typ verweisen. Der .NET Garbage Collector bereinigt den Speicher für ein Objekt nur, wenn der letzte Typ, der darauf verweist, freigegeben wurde.

Die Struktur Referenzierte Typen enthält die Verweise, die von dem Typ gehalten werden, der im oberen Bereich ausgewählt ist.

Screenshot des Berichts

Die Struktur Referenzierte Typen enthält die Verweise, die von dem Typ gehalten werden, der im oberen Bereich ausgewählt ist.

Screenshot des Berichts

Berichtsstrukturfilter

Viele Typen in Apps sind für App-Entwickler nicht erforderlich, um Speicherprobleme zu untersuchen. Mit den Filtern für Momentaufnahmenberichte können die meisten dieser Typen in den Strukturen Verwalteter Speicher und Pfade zum Stamm ausgeblendet werden.

Sortier- und Filteroptionen

Sortier- und Filteroptionen

  • Um einen Baum nach Typnamen zu filtern, geben Sie den Namen in das Feld Filter ein. Der Filter berücksichtigt die Groß- und Kleinschreibung nicht und erkennt die angegebene Zeichenfolge in jedem Teil des Typnamens.

  • Wählen Sie Nur meinen Code anzeigen im Dropdownmenü Filter aus, um die meisten Instanzen auszublenden, die von externem Code generiert werden. Externe Typen gehören zu den Betriebssystem- oder Frameworkkomponenten oder werden vom Compiler generiert.

  • Wählen Sie Kleine Objekte zuklappen im Dropdownmenü Filter aus, um Typen auszublenden, deren Größe (Byte) kleiner als 0,5 Prozent des gesamten Arbeitsspeichers entspricht.

Berichte zu nativen Typen

Wählen Sie die aktuelle Verknüpfung einer Zuweisungen (Diff.)- oder Heapgröße (Diff.)-Zelle aus der Zusammenfassungstabelle zur Speicherauslastung im Fenster Diagnosetools aus.

Screenshot: Ansicht „Nativer Typ“.

Screenshot: Ansicht „Nativer Typ“.

Die Typenansicht zeigt die Anzahl und Größe der Typen in der Momentaufnahme an.

  • Wählen Sie das Symbol Instanzen anzeigen neben einem ausgewählten Typ aus, um Informationen zu den Objekten des ausgewählten Typs in der Momentaufnahme anzuzeigen.

    Die Ansicht Instanzen zeigt jede Instanz des ausgewählten Typs an. Durch Auswahl einer Instanz wird die Aufrufliste angezeigt, welche die Erstellung der Instanz im Bereich Belegungsaufrufliste bewirkt hat. (Diese Informationen sind nur beim Debuggen verfügbar.)

    Screenshot: Ansicht „Instanzen“ und Bereich „Belegungsaufrufliste“.

  • Wählen Sie das Instanzsymbol (Das Instanzsymbol in der Spalte ) eines ausgewählten Typs aus, um Informationen zu den Objekten des ausgewählten Typs in der Momentaufnahme anzuzeigen.

    Die Ansicht Instanzen zeigt jede Instanz des ausgewählten Typs an. Wenn Sie eine Instanz auswählen, wird der Call Stack angezeigt, der zur Erstellung der Instanz im Bereich Allocation Call Stack geführt hat.

    Screenshot: Ansicht „Instanzen“ und Bereich „Belegungsaufrufliste“

  • Wählen Sie Stapel aus, um die Belegungsliste für den ausgewählten Typ anzuzeigen.

    Screenshot der Stapelansicht.

  • Wählen Sie in der Liste Ansichtsmodus die Option Stapelansicht aus, um den Zuordnungsstapel für den ausgewählten Typ anzuzeigen.

    Screenshot der Stapelansicht.

Einblicke zur Speicherauslastung

Für verwalteten Speicher bietet das Speicheranalysetool auch mehrere leistungsstarke integrierte automatische Erkenntnisse. Wählen Sie die Registerkarte Erkenntnisse in den Berichten vom Typ „Verwaltet“ aus, um die anwendbaren automatischen Erkenntnisse anzuzeigen (z. B. Doppelte Zeichenfolgen, Sparsearrays und Ereignishandlerverluste).

Screenshot der Ansicht „Erkenntnis“ im Speicherauslastungstool.

Im Abschnitt duplizierte Zeichenfolgen wird die Liste der Zeichenfolgen angezeigt, die mehrmals auf dem Heap zugeordnet werden. Darüber hinaus zeigt dieser Abschnitt den gesamten verschwendeten Arbeitsspeicher, d. h. die (Anzahl der Instanzen - 1) mal die Größe der Zeichenfolge.

Der Abschnitt Sparse Arrays zeigt Arrays an, die hauptsächlich mit Nullelementen gefüllt sind, was ineffizient in Bezug auf Leistung und Speicherauslastung sein kann. Das Speicheranalysetool erkennt diese Arrays automatisch und zeigt Ihnen, wie viel Arbeitsspeicher aufgrund dieser Nullwerte verschwendet wird.

Der Abschnitt Ereignishandlerlecks, der in Visual Studio 2022, Version 17.9 Preview 1 verfügbar ist, zeigt potenzielle Speicherlecks an, die auftreten können, wenn ein Objekt das Ereignis eines anderen Objekts abonniert. Wenn der Herausgeber des Ereignisses die Abonnierenden überdauert, bleiben die Abonnierenden bestehen, auch wenn es keine weiteren Verweise auf sie gibt. Dies kann zu Speicherlecks führen, bei denen nicht verwendeter Arbeitsspeicher nicht ordnungsgemäß freigegeben wird, was dazu führt, dass die Anwendung im Laufe der Zeit mehr und mehr Arbeitsspeicher verwendet.

Für bestimmte Typen sind Felder bekannt, die gelesen werden können, um die Größe des nativen Speichers zu bestimmen, zu dem sie gehören. Auf der Registerkarte Insights werden gefälschte native Speicherknoten im Objektdiagramm angezeigt, die von ihren übergeordneten Objekten beibehalten werden, sodass sie von der Benutzeroberfläche erkannt und ihre Größe sowie das Referenzdiagramm angezeigt werden.

Screenshot: Native Ansicht zu Erkenntnissen im Speicherauslastungstool

Änderungsberichte (Diff)

  • Wählen Sie den Änderungslink in einer Zelle des bereichs Snapshot auf der Übersichtsseite "Speichernutzung" aus.

    Screenshot: Auswählen eines Änderungslinks in einer Zelle

    Screenshot des Links

  • Wählen Sie eine Momentaufnahme aus der Liste Vergleichen mit eines verwalteten oder systemeigenen Berichts aus.

    Screenshot: Auswählen einer Momentaufnahme aus der Liste „Vergleichen mit“.

    Screenshot: Auswählen einer Momentaufnahme aus der Liste „Vergleichen mit“.

Der Änderungsbericht fügt dem Basisbericht Spalten (durch (Diff)gekennzeichnet) hinzu, die den Unterschied zwischen der Basismomentaufnahme und der Vergleichsmomentaufnahme zeigen. So könnte ein Unterschiedsbericht für die Ansicht mit nativen Typen aussehen:

Screenshot: Ansicht „Unterschiede bei nativen Typen“

Screenshot: Ansicht „Unterschiede bei nativen Typen“

Im oberen Bereich werden Anzahl und Größe der Typen in der Momentaufnahme angezeigt, einschließlich der Größe aller Objekte, auf die der Typ verweist (Inklusive Größe).