Nástroj pro analýzu haldy (dotnet-gcdump)
Tento článek se vztahuje na: ✔️ dotnet-gcdump
verze 3.1.57502 a novější verze
Instalace
Existují dva způsoby, jak stáhnout a nainstalovat dotnet-gcdump
:
dotnet global tool:
Pokud chcete nainstalovat nejnovější verzi
dotnet-gcdump
balíčku NuGet, použijte příkaz dotnet tool install :dotnet tool install --global dotnet-gcdump
Přímé stahování:
Stáhněte spustitelný soubor nástroje, který odpovídá vaší platformě:
Operační systém Platforma Windows x86 | x64 | Arm | Arm64 Linux x64 | Arm | Arm64 | musl-x64 | musl-Arm64
Poznámka:
Pokud chcete použít dotnet-gcdump
v aplikaci x86, potřebujete odpovídající verzi nástroje x86.
Synopse
dotnet-gcdump [-h|--help] [--version] <command>
Popis
Globální dotnet-gcdump
nástroj shromažďuje výpisy paměti GC (Garbage Collector) živých procesů .NET pomocí eventPipe. Výpisy paměti GC se vytvářejí aktivací GC v cílovém procesu, zapnutím zvláštních událostí a opětovném vygenerováním grafu kořenových objektů z datového proudu událostí. Tento proces umožňuje shromažďování výpisů paměti paměti, když je proces spuštěný a s minimální režií. Tyto výpisy paměti jsou užitečné pro několik scénářů:
- Porovnání počtu objektů v haldě v několika bodech v čase.
- Analýza kořenů objektů (odpovídání na otázky typu "co stále obsahuje odkaz na tento typ?").
- Shromažďování obecných statistik o počtech objektů v haldě.
Zobrazení výpisu paměti GC zachyceného z dotnet-gcdump
Ve Windows .gcdump
lze soubory zobrazit v nástroji PerfView pro analýzu nebo v sadě Visual Studio. V současné době neexistuje způsob, jak otevřít na .gcdump
platformách jiných než Windows.
Můžete shromáždit více .gcdump
s a otevřít je současně v sadě Visual Studio, abyste získali možnosti porovnání.
Možnosti
--version
Zobrazí verzi
dotnet-gcdump
nástroje.-h|--help
Zobrazuje nápovědu k příkazovému řádku.
Příkazy
Příkaz |
---|
dotnet-gcdump collect |
dotnet-gcdump ps |
dotnet-gcdump report |
dotnet-gcdump collect
Shromažďuje výpis paměti paměti z aktuálně spuštěného procesu.
Upozorňující
Pokud chcete projít haldu uvolňování paměti GC, tento příkaz aktivuje uvolňování paměti generace 2 (úplné), což může pozastavit modul runtime po dlouhou dobu, zejména v případě, že halda uvolňování paměti je velká. Tento příkaz nepoužívejte v prostředích citlivých na výkon, pokud je halda GC velká.
Synopse
dotnet-gcdump collect [-h|--help] [-p|--process-id <pid>] [-o|--output <gcdump-file-path>] [-v|--verbose] [-t|--timeout <timeout>] [-n|--name <name>]
Možnosti
-h|--help
Zobrazuje nápovědu k příkazovému řádku.
-p|--process-id <pid>
ID procesu pro shromáždění výpisu paměti paměti z.
-o|--output <gcdump-file-path>
Cesta, kam se mají zapisovat shromážděné výpisy paměti paměti. Výchozí hodnota je .\YYYYMMDD_HHMMSS_<pid.gcdump>.
-v|--verbose
Vypíše protokol při shromažďování výpisu paměti paměti.
-t|--timeout <timeout>
Vzdát se shromažďování výpisu paměti GC, pokud trvá déle než tento počet sekund. Výchozí hodnota je 30.
-n|--name <name>
Název procesu pro shromáždění výpisu paměti paměti z.
Poznámka:
V Linuxu a macOS tento příkaz očekává cílovou aplikaci a dotnet-gcdump
bude sdílet stejnou proměnnou TMPDIR
prostředí. Jinak vyprší časový limit příkazu.
Poznámka:
Chcete-li shromáždit výpis paměti paměti pomocí dotnet-gcdump
, musí být spuštěn jako stejný uživatel jako uživatel, který spouští cílový proces nebo jako kořen. Jinak se nástroj nepodaří navázat spojení s cílovým procesem.
dotnet-gcdump ps
Zobrazí seznam procesů dotnet, pro které lze shromažďovat výpisy paměti paměti. dotnet-gcdump 6.0.320703 a novější zobrazte také argumenty příkazového řádku, se kterými byly jednotlivé procesy spuštěny, pokud jsou k dispozici.
Synopse
dotnet-gcdump ps [-h|--help]
Příklad
Předpokládejme, že spustíte dlouhotrvající aplikaci pomocí příkazu dotnet run --configuration Release
. V jiném okně spustíte dotnet-gcdump ps
příkaz. Výstup, který uvidíte, je následující. Pokud existují argumenty příkazového řádku, zobrazí se ve dotnet-gcdump
verzi 6.0.320703 a novější.
> 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>
Vygenerujte sestavu z dříve generovaného výpisu paměti GC nebo ze spuštěného procesu a zapište do stdout
souboru .
Synopse
dotnet-gcdump report [-h|--help] [-p|--process-id <pid>] [-t|--report-type <HeapStat>]
Možnosti
-h|--help
Zobrazuje nápovědu k příkazovému řádku.
-p|--process-id <pid>
ID procesu pro shromáždění výpisu paměti paměti z.
-t|--report-type <HeapStat>
Typ sestavy, kterou chcete vygenerovat. Dostupné možnosti: haldy (výchozí).
Odstraňování potíží
V souboru gcdump nejsou žádné informace o typu.
Před .NET Core 3.1 došlo k problému, kdy se při vyvolání pomocí eventPipe nevymazala mezipaměť typu mezi gcdumps. Výsledkem byly události potřebné k určení informací o typu, které se neodesílají za sekundu a následné gcdumps. Tato oprava byla opravena v .NET Core 3.1-Preview2.
Com a statické typy nejsou v výpisu paměti GC.
Před .NET Core 3.1 došlo k problému, kdy se statické typy a typy MODELU COM neodesílaly při vyvolání výpisu paměti paměti přes EventPipe. Tato oprava byla opravena v .NET Core 3.1.
dotnet-gcdump
kvůli chybějícím informacím.gcdump
nelze vygenerovat soubor, například [Chyba] Výjimka během gcdump: System.ApplicationException: Soubor ETL zobrazuje začátek výpisu haldy, ale ne jeho dokončení..gcdump
Nebo soubor neobsahuje celou haldu.dotnet-gcdump
funguje tak, že shromažďuje trasování událostí vygenerovaných uvolňováním paměti během indukované kolekce generace 2. Pokud je halda dostatečně velká nebo není dostatek paměti pro škálování vyrovnávacích pamětí událostí, můžou se vynechat události potřebné k rekonstrukci grafu haldy z trasování. V takovém případě se doporučuje kvůli diagnostice problémů s haldou shromáždit výpis stavu procesu.dotnet-gcdump
zdá se způsobit problém s nedostatkem paměti v omezeném prostředí paměti.dotnet-gcdump
funguje tak, že shromažďuje trasování událostí vygenerovaných uvolňováním paměti během indukované kolekce generace 2. Cílová aplikace vlastní vyrovnávací paměť pro kolekci událostí a může růst až 256 MB.dotnet-gcdump
také používá paměť. Pokud je vaše prostředí omezené na paměť, nezapomeňte při shromažďování souboru gcdump zohlednit tyto faktory, aby se zabránilo chybám.