Heapanalysetool (dotnet-gcdump)
Dieser Artikel gilt für: ✔️ dotnet-gcdump
3.1.57502 und höhere Versionen
Installieren
Es gibt zwei Möglichkeiten, dotnet-gcdump
herunterzuladen und zu installieren:
Globales dotnet-Tool:
Verwenden Sie zum Installieren der neuesten Releaseversion des NuGet-Pakets
dotnet-gcdump
den Befehl dotnet tool install:dotnet tool install --global dotnet-gcdump
Direkter Download:
Laden Sie die ausführbare Datei für das Tool herunter, die Ihrer Plattform entspricht:
OS Plattform Windows x86 | x64 | Arm | Arm64 Linux x64 | Arm | Arm64 | musl-x64 | musl-Arm64
Hinweis
Sie benötigen eine entsprechende x86-Version des Tools, um dotnet-gcdump
für eine x86-App verwenden zu können.
Übersicht
dotnet-gcdump [-h|--help] [--version] <command>
Beschreibung
Das globale dotnet-gcdump
-Tool sammelt Garbage Collector-Speicherabbilder (GC) von .NET-Liveprozessen mithilfe von EventPipe. GC-Speicherabbilder werden durch das Auslösen einer automatischen Speicherbereinigung im Zielprozess, das Aktivieren spezieller Ereignisse und das wiederholte Generieren des Graphs der Objektstämme aus dem Ereignisdatenstrom erstellt. Dieser Prozess ermöglicht das Erfassen von GC-Speicherabbildern während der Prozessausführung mit minimalem Aufwand. Diese Speicherabbilder sind für verschiedene Szenarios nützlich:
- Vergleichen der Anzahl von Objekten auf dem Heap zu verschiedenen Zeitpunkten
- Analysieren des Stamms von Objekten (Beantwortung von Fragen wie „Was verweist noch auf diesen Typ?“)
- Erfassen allgemeiner Statistiken über die Anzahl von Objekten auf dem Heap
Anzeigen des von dotnet-gcdump erfassten GC-Speicherabbilds
Unter Windows können .gcdump
-Dateien zur Analyse in PerfView oder in Visual Studio angezeigt werden. Derzeit gibt es keine Möglichkeit, eine .gcdump
-Datei auf anderen Plattformen als Windows zu öffnen.
Sie können mehrere .gcdump
-Dateien erfassen und gleichzeitig in Visual Studio öffnen, um sie zu vergleichen.
Tastatur
--version
Hiermit wird die Version des
dotnet-gcdump
-Hilfsprogramms angezeigt.-h|--help
Zeigt die Hilfe für die Befehlszeile an.
Befehle
Befehl |
---|
dotnet-gcdump collect |
dotnet-gcdump ps |
dotnet-gcdump report |
dotnet-gcdump collect
Hiermit wird ein GC-Speicherabbild aus einem derzeit laufenden Prozess erfasst.
Warnung
Dieser Befehl löst eine (vollständige) Garbage Collection (GC) der Generation 2 aus, um den GC-Heap zu durchlaufen. Dadurch kann die Runtime für längere Zeit unterbrochen werden – insbesondere dann, wenn der GC-Heap groß ist. Verwenden Sie diesen Befehl nicht in leistungsabhängigen Umgebungen, wenn der GC-Heap groß ist.
Übersicht
dotnet-gcdump collect [-h|--help] [-p|--process-id <pid>] [-o|--output <gcdump-file-path>] [-v|--verbose] [-t|--timeout <timeout>] [-n|--name <name>]
Optionen
-h|--help
Zeigt die Hilfe für die Befehlszeile an.
-p|--process-id <pid>
Dies ist die ID des Prozesses, von dem das GC-Speicherabbild erfasst werden soll.
-o|--output <gcdump-file-path>
Dies ist der Pfad, in den erfasste GC-Speicherabbilder geschrieben werden sollen. Wird standardmäßig auf .\YYYYMMDD_HHMMSS_<pid>.gcdump festgelegt.
-v|--verbose
Hiermit wird das Protokoll während der Erfassung des GC-Speicherabbilds ausgegeben.
-t|--timeout <timeout>
Hiermit wird die Erfassung des GC-Speicherabbilds angehalten, wenn diese länger als eine bestimmte Anzahl von Sekunden dauert. Der Standardwert ist 30.
-n|--name <name>
Dies ist der Name des Prozesses, von dem das GC-Speicherabbild erfasst werden soll.
Hinweis
Unter Linux und macOS erwartet dieser Befehl, dass die Zielanwendung und dotnet-gcdump
die gleiche TMPDIR
-Umgebungsvariable verwenden. Andernfalls führt der Befehl zu einem Timeout.
Hinweis
Wenn Sie mit dotnet-gcdump
ein Garbage Collection-Speicherabbild erfassen möchten, muss der Befehl vom Rootbenutzer oder dem Benutzer ausgeführt werden, der den Zielprozess ausführt. Andernfalls kann das Tool keine Verbindung mit dem Zielprozess herstellen.
dotnet-gcdump ps
Hiermit werden die dotnet-Prozesse aufgelistet, für die GC-Speicherabbilder erfasst werden können. Ab dotnet-gcdump 6.0.320703 werden auch die Befehlszeilenargumente angezeigt, mit denen jeder Prozess gestartet wurde, sofern verfügbar.
Übersicht
dotnet-gcdump ps [-h|--help]
Beispiel
Angenommen, Sie starten eine zeitintensive App mit dem Befehl dotnet run --configuration Release
. In einem anderen Fenster führen Sie den Befehl dotnet-gcdump ps
aus. Die Ausgabe sieht wie folgt aus. Sofern vorhanden, werden die Befehlszeilenargumente ab der dotnet-gcdump
-Version 6.0.320703 angezeigt.
> dotnet-gcdump ps
21932 dotnet C:\Program Files\dotnet\dotnet.exe run --configuration Release
36656 dotnet C:\Program Files\dotnet\dotnet.exe
dotnet-gcdump report <gcdump_filename>
Hiermit wird ein Bericht aus einem zuvor generierten GC-Speicherabbild oder aus einem laufenden Prozess generiert und in stdout
geschrieben.
Übersicht
dotnet-gcdump report [-h|--help] [-p|--process-id <pid>] [-t|--report-type <HeapStat>]
Optionen
-h|--help
Zeigt die Hilfe für die Befehlszeile an.
-p|--process-id <pid>
Dies ist die ID des Prozesses, von dem das GC-Speicherabbild erfasst werden soll.
-t|--report-type <HeapStat>
Dies ist der Typ des zu generierenden Berichts. Verfügbare Optionen: HeapStat (Standard)
Problembehandlung
In der gcdump-Datei sind keine Typinformationen enthalten.
Vor .NET Core 3.1 gab es ein Problem, bei dem ein Typcache zwischen gcdump-Dateien nicht gelöscht wurde, wenn diese mit EventPipe aufgerufen wurden. Dies führte dazu, dass die Ereignisse, die zum Bestimmen der Typinformationen benötigt werden, für die zweite und nachfolgende gcdump-Dateien nicht gesendet wurden. Dieses Problem wurde in .NET Core 3.1-preview2 behoben.
COM- und statische Typen sind nicht im GC-Speicherabbild enthalten.
Vor .NET Core 3.1 gab es ein Problem, bei dem statische und COM-Typen nicht gesendet wurden, wenn das GC-Speicherabbild über EventPipe aufgerufen wurde. Dies wurde in .NET Core 3.1 behoben.
dotnet-gcdump
kann aufgrund fehlender Informationen keine.gcdump
-Datei erstellen, z. B. [Fehler] Ausnahme während gcdump: System.ApplicationException: ETL-Datei zeigt den Beginn eines Heapspeicherabbilds, aber nicht die Beendigung.. Oder die.gcdump
-Datei enthält nicht den gesamten Heap.dotnet-gcdump
erfasst eine Ablaufverfolgung von Ereignissen, die vom Garbage Collector während einer induzierten Generation 2-Auflistung ausgegeben werden. Wenn der Heap ausreichend groß ist oder nicht genügend Arbeitsspeicher zum Skalieren der Ereignispuffer vorhanden ist, werden möglicherweise die Ereignisse gelöscht, die zum Rekonstruieren des Heapdiagramms aus der Ablaufverfolgung erforderlich sind. In diesem Fall wird empfohlen, ein Speicherabbild des Prozesses zu erfassen, um Probleme mit dem Heap zu diagnostizieren.dotnet-gcdump
scheint das Problem „Nicht genügend Arbeitsspeicher“ in einer Speicherumgebung mit eingeschränktem Arbeitsspeicher zu verursachen.dotnet-gcdump
erfasst eine Ablaufverfolgung von Ereignissen, die vom Garbage Collector während einer induzierten Generation 2-Auflistung ausgegeben werden. Der Puffer für die Ereignissammlung befindet sich im Besitz der Zielanwendung und kann bis zu 256 MB groß werden.dotnet-gcdump
selbst verwendet auch Arbeitsspeicher. Wenn die Arbeitsspeichermenge in Ihrer Umgebung beschränkt ist, berücksichtigen Sie diese Faktoren beim Erfassen eines gcdump, um Fehler zu vermeiden.