Analysieren der Speicherauslastung mithilfe des .NET-Tools für die Objektzuordnung

Mithilfe des .NET-Tools für die Objektzuordnung können Sie anzeigen, wie viel Arbeitsspeicher Ihre App insgesamt belegt und für welche Codepfade der Bedarf am höchsten ist.

Nach der Ausführung des Tools können Sie die Pfad zur Funktionsausführung sehen, in denen Objekte zugewiesen werden. Anschließend können Sie durch eine Rückverfolgung bis zum Stamm die Aufrufstruktur ermitteln, die den meisten Arbeitsspeicher belegt.

Eine Anleitung zur Verbesserung der Leistung mithilfe des Tools für die .NET-Objektzuordnung finden Sie unter Fallstudie: Leitfaden für Anfänger zum Optimieren von Code.

Setup

  1. Öffnen Sie über ALT+F2 den Leistungs-Profiler in Visual Studio.

  2. Aktivieren Sie das Kontrollkästchen Nachverfolgung der .NET-Objektzuordnung.

    Screenshot: Ausgewähltes Tool „Nachverfolgung der .NET-Objektzuordnung“.

    Screenshot: Ausgewähltes Tool „Nachverfolgung der .NET-Objektzuordnung“.

  3. Klicken Sie auf die Schaltfläche Start, um das Tool auszuführen.

    Wenn Sie die Option Mit angehaltener Sammlung starten vor dem Starten des Profilers aktivieren, werden die Daten erst erfasst, wenn Sie in der Diagnosesitzungsansicht die Schaltfläche Aufzeichnen auswählen.

  4. Gehen Sie nach dem Start des Tools das Szenario durch, für das Sie in Ihrer App ein Profil erstellen möchten. Klicken Sie dann auf Sammlung beenden, oder schließen Sie Ihre App, um die Daten anzuzeigen.

    Screenshot: Fenster mit der Option „Sammlung beenden“.

    Screenshot: Fenster mit der Option „Sammlung beenden“.

  5. Wählen Sie die Registerkarte Zuordnung aus. Speicherbelegungsdaten wie die folgenden werden angezeigt.

    Screenshot: Registerkarte „Zuordnung“.

    Screenshot: Registerkarte „Zuordnung“.

Sie können jetzt die Speicherbelegung der Objekte analysieren.

Während der Sammlung kann das Überwachungstool die App verlangsamen, für die das Profil erstellt wird. Falls die Leistung des Tools oder der App herabgesetzt wird und Sie nicht jedes Objekt nachverfolgen müssen, können Sie die Stichprobenhäufigkeit anpassen. Klicken Sie hierzu auf der Seite mit der Profilerzusammenfassung auf das Zahnradsymbol neben dem Überwachungstool.

Screenshot: Einstellungen für das .NET-Zuordnungstool.

Screenshot: Einstellungen für das .NET-Zuordnungstool.

Passen Sie die Stichprobenhäufigkeit wie gewünscht an. Diese Änderung verbessert die Leistung Ihrer App während der Datensammlung und Analyse.

Screenshot: Angepasste Samplingrate.

Screenshot: Angepasste Samplingrate.

Weitere Informationen zur Optimierung des Tools finden Sie unter Optimieren der Profilereinstellungen.

Verstehen Ihrer Daten

In der folgenden grafischen Darstellung wird im oberen Diagramm die Anzahl von Liveobjekten in Ihrer App angezeigt. Das untere Diagramm Objektdelta zeigt die prozentuale Änderung von App-Objekten. Rote Linien kennzeichnen, wann eine Garbage Collection stattgefunden hat.

Screenshot: Diagramm für das .NET-Zuordnungstool.

Screenshot: Diagramm für das .NET-Zuordnungstool.

Sie können die tabellarischen Daten filtern, um nur Aktivitäten für einen angegebenen Zeitraum anzuzeigen, indem Sie einen Zeitbereich auswählen. In diesem Fall werden die Informationen, die auf den Registerkarten angezeigt werden, auf den gefilterten Zeitbereich festgelegt.

Screenshot: Gefiltertes Diagramm der .NET-Zuordnungszeit.

Screenshot: Gefiltertes Diagramm der .NET-Zuordnungszeit.

Außerdem können Sie einen Bereich des Diagramms vergrößern oder verkleinern.

Zuteilung

In der Ansicht Zuordnung können Sie sehen, welche Objekte wie viel Arbeitsspeicher belegen und wo sich diese Objekte befinden.

Screenshot: Erweiterte Ansicht für „Zuordnung“.

Screenshot: Erweiterte Ansicht für „Zuordnung“.

Die folgenden Informationen werden in der Ansicht Zuordnung angezeigt:

  • Die Spalte Typ enthält eine Liste der Klassen und Strukturen, die Arbeitsspeicher verbrauchen. Doppelklicken Sie auf einen Typ, um die Rückverfolgung als umgekehrte Aufrufstruktur anzuzeigen. Nur in der Ansicht Zuordnung können Sie Elemente innerhalb der ausgewählten Kategorie anzeigen, die Arbeitsspeicher beanspruchen.

  • Die Spalte Zuordnungen zeigt die Anzahl von Objekten an, die innerhalb eines bestimmten Zuordnungstyps oder einer bestimmten Funktion Arbeitsspeicher belegen. Diese Spalte wird nur in den Ansichten Speicherbelegung, Aufrufbaum und Funktionen angezeigt.

  • Die Spalten Byte und Average Size (Bytes) (Durchschnittliche Größe (Byte)) werden standardmäßig nicht angezeigt. Damit sie eingeblendet werden, müssen Sie mit der rechten Maustaste auf die Spalte Typ oder Zuordnungen klicken und dann die Optionen Byte und Durchschnittliche Größe (Byte) auswählen, um sie dem Diagramm hinzuzufügen.

    Die zwei Spalten ähneln Gesamt (Zuordnungen) und Selbst (Zuordnungen) , zeigen jedoch die Menge des belegten Arbeitsspeichers anstelle der Anzahl von Objekten an, die Arbeitsspeicher verbrauchen. Diese Spalten sind nur in der Ansicht Zuordnung enthalten.

  • Die Spalte Modulname zeigt das Modul an, das die aufrufende Funktion oder den aufrufenden Prozess enthält.

Alle diese Spalten sind sortierbar. Die Elemente in den Spalten Typ und Modulname können Sie alphabetisch sortieren (in aufsteigender oder absteigender Reihenfolge). Für Zuordnungen, Byte und Durchschnittliche Größe (Byte) können Sie Elemente sortieren, indem Sie den numerischen Wert erhöhen oder verringern.

Symbole

Die folgenden Symbole erscheinen auf den Registerkarten Zuordnungen, Aufrufstruktur und Funktionen:

  • Symbol für Werttyp – Werttyp (z. B. ein Integer)

  • Symbol für Werttypsammlung – Werttypsammlung (z. B. ein Array aus Integern)

  • Symbol für Referenztyp – Referenztyp (z. B. eine Zeichenfolge)

  • Symbol für die Referenztypsammlung – Referenztypsammlung (z. B. ein Array aus Zeichenfolgen)

Aufrufstruktur

Die Ansicht Aufrufbaum zeigt die Funktionsausführungspfade an, die Objekte mit einem hohen Arbeitsspeicherverbrauch enthalten.

Screenshot: Ansicht „Aufrufstruktur“.

Screenshot: Ansicht „Aufrufstruktur“.

Die folgenden Informationen werden in der Ansicht Aufrufstruktur angezeigt:

  • Die Spalte Funktionsname zeigt den Prozess oder den Namen der Funktion an, die Objekte mit hohem Arbeitsspeicherverbrauch enthält. Die Anzeige basiert auf der Knotenebene, auf der die Untersuchung erfolgt.
  • Die Spalten Gesamt (Zuordnungen) und Gesamtgröße (Byte) zeigen die Anzahl von zugeordneten Objekten und die Menge von Arbeitsspeicher, die von einer Funktion und allen von ihr aufgerufenen Funktionen belegt wird. Die Spalte Gesamtgröße (Bytes) ist standardmäßig ausgeblendet.
  • Die SpaltenSelbst (Zuordnungen) undAutomatische Größe (Bytes) zeigen die Anzahl von zugeordneten Objekten und die Gesamtmenge an Arbeitsspeicher, die von einer einzelnen ausgewählten Funktion oder dem Zuordnungstyp belegt wird.
  • Die Spalte Durchschnittliche Größe (Bytes) zeigt die gleichen Informationen wie in der Ansicht Zuordnungen an. Diese Spalte wird standardmäßig ausgeblendet.
  • Die Spalte Modulname zeigt das Modul an, das die aufrufende Funktion oder den aufrufenden Prozess enthält.

Weitere Optionen, die in der Ansicht Aufrufstruktur angezeigt werden, sind:

  • Wenn Sie auf die Schaltfläche Langsamsten Pfad erweitern klicken, wird ein Funktionsausführungspfad hervorgehoben, der viele Objekte enthält, die Arbeitsspeicher belegen. Der Algorithmus startet beim ausgewählten Knoten, hebt den Pfad der meisten Zuordnungen hervor und unterstützt Sie bei der Untersuchung.
  • Die Schaltfläche Langsamsten Pfad anzeigen blendet das Flammensymbol ein oder aus, das zeigt, welche Knoten Teil des langsamsten Pfads sind.

Screenshot: Erweiterter langsamster Pfad.

Screenshot: Erweiterter langsamster Pfad.

Functions

Mit der Ansicht Funktionen können Sie sich Prozesse, Module und Funktionen anzeigen lassen, die Arbeitsspeicher belegen.

Screenshot: Ansicht „Funktionen“.

Screenshot: Ansicht „Funktionen“.

Folgende Informationen werden u. a. in der Ansicht Funktionen angezeigt:

  • In der Spalte Name werden Prozesse als Knoten der obersten Ebene angezeigt. Unterhalb der Prozesse befinden sich die Module und darunter die Funktionen.

  • Die folgenden Spalten, die die gleichen Informationen wie in den Ansichten Zuordnung und Aufrufstruktur anzeigen:

    • Gesamt (Zuordnungen)
    • Selbst (Zuordnungen)
    • Gesamtgröße (Bytes)
    • Automatische Größe (Bytes)
    • Durchschnittliche Größe (Bytes)

Collection

In der Ansicht Sammlung können Sie sehen, wie viele Objekte während der Garbage Collection gesammelt oder beibehalten wurden.

Screenshot: Ansicht „Sammlung“.

Screenshot: Ansicht „Sammlung“.

Die folgenden Informationen werden in der Ansicht Sammlung angezeigt:

  • Die Spalte GC zeigt die ID dieser Garbage Collection im Lebenszyklus der ausführbaren Datei an.
  • Die Spalte Generation zeigt die Generation der Garbage Collection an.
  • Die Spalte GC-Typ zeigt den Typ dieser Garbage Collection an.
  • Die Spalte Ursache für GC zeigt die Ursache für dieses Garbage Collection-Ereignis an.
  • Die Spalte Dauer der Pause zeigt den Zeitpunkt an, zu dem die Ausführung blockiert wurde, da der Garbage Collector den Heap exklusiv verwenden muss. Für eine Garbage Collection im Hintergrund ist dieser Wert klein.
  • Die Spalte LOH-Größe zeigt die Größe des Heaps für große Objekte an, nachdem der Garbage Collector ausgeführt wurde.
  • Die Spalte POH-Größe zeigt die Größe des Heaps für angeheftete Objekte an, nachdem der Garbage Collector ausgeführt wurde.
  • Die Spalte Finalisierbare überlebende Objekte (MB) zeigt die Anzahl der MB von Objekten an, die Finalizer (Destruktoren) aufweisen, die nach der Garbage Collection noch vorhanden sind.
  • Die Spalte Angeheftete Objekte zeigt die Anzahl der angehefteten Objekte an, die von dieser Garbage Collection höher gestuft wurden.
  • In der Spalte Collected (Gesammelt) wird die Anzahl der Objekte angezeigt, die vom Garbage Collector erfasst wurden.
  • Die Spalte Survived (Verblieben) zeigt, wie viele Objekte nach der Ausführung des Garbage Collectors noch vorhanden waren.

Wenn Sie eine Zeile auswählen, zeigt diese Ansicht auch Kreisdiagramme an, mit denen die gesammelten und noch verfügbaren Objekte nach Typ grafisch dargestellt werden.

Screenshot: Kreisdiagramme in der Ansicht „Sammlung“.

Filtertools

Die Ansichten Zuordnungen, Aufrufstruktur und Funktionen enthalten alle die Optionen Nur eigenen Code anzeigen und Nativen Code anzeigen und ein Filterfeld.

  • Nur eigenen Code anzeigen: Damit Sie sich auf den eigenen Code konzentrieren können, werden Systeme, Frameworks und anderer nicht vom Benutzer stammender Code hinter Frames ( [Externer Code] ) verborgen. Weitere Informationen finden Sie unter Funktion „Nur eigenen Code anzeigen“ verwenden, um nur eigenen Code zu debuggen.
  • Nativen Code anzeigen: Zeigt nativen Code in der Analyse an, einschließlich Code, der nicht vom Benutzer stammt.
  • Mit dem Filterfeld können Sie basierend auf dem angegebenen Wert die Spalten Name oder Funktionsname filtern. Geben Sie einen Zeichenfolgenwert in das Feld ein. Die Tabelle zeigt anschließend nur Typen an, die diese Zeichenfolge enthalten.