Outil d’analyse du segment de mémoire (dotnet-gcdump)
Cet article s’applique à : ✔️ dotnet-gcdump
version 3.1.57502 et versions ultérieures
Installer
Il existe deux façons de télécharger et d’installer dotnet-gcdump
:
outil global dotnet :
Pour installer la dernière version de version du
dotnet-gcdump
package NuGet, utilisez la commande installation de l’outil dotnet :dotnet tool install --global dotnet-gcdump
Téléchargement direct :
Téléchargez l’exécutable de l’outil qui correspond à votre plateforme :
Système d''exploitation Plateforme Windows x86 | x64 | Arm | Arm64 Linux x64 | Arm | Arm64 | musl-x64 | musl-Arm64
Notes
Pour utiliser dotnet-gcdump
sur une application x86, vous avez besoin d’une version x86 correspondante de l’outil.
Synopsis
dotnet-gcdump [-h|--help] [--version] <command>
Description
L’outil dotnet-gcdump
global collecte les images mémoire GC (Garbage Collector ou récupérateur de mémoire) des processus .NET en direct à l’aide d’EventPipe. Les images mémoires GC sont créées en déclenchant un GC dans le processus cible, en activant des événements spéciaux et en régénérant le graphique des racines d’objet à partir du flux d’événements. Ce processus permet de collecter les images mémoires GC pendant l’exécution du processus et avec une surcharge minimale. Ces images mémoires sont utiles pour plusieurs scénarios :
- Comparaison du nombre d’objets sur le segment de mémoire à plusieurs moments dans le temps.
- Analyse des racines d’objets (répondre à des questions telles que « qu’est-ce qui a encore une référence pour ce type ? »).
- Collecte de statistiques générales sur le nombre d’objets sur le tas.
Afficher l’image mémoire GC capturée à partir de dotnet-gcdump
Sous Windows, les fichiers .gcdump
peuvent être affichés dans PerfView à des fins d’analyse ou dans Visual Studio. Actuellement, il n’existe aucun moyen d’ouvrir un .gcdump
sur des plateformes non Windows.
Vous pouvez collecter plusieurs .gcdump
et les ouvrir simultanément dans Visual Studio pour les comparer.
Options
--version
Affiche la version de l’utilitaire
dotnet-gcdump
.-h|--help
Affiche l’aide de la ligne de commande.
Commandes
Commande |
---|
dotnet-gcdump collect |
dotnet-gcdump ps |
dotnet-gcdump report |
dotnet-gcdump collect
Collecte une image mémoire GC à partir d’un processus en cours d’exécution.
Avertissement
Pour parcourir le segment de mémoire GC, cette commande déclenche un nettoyage de la mémoire de génération 2 (complet), qui peut suspendre l’exécution pendant une longue période, en particulier lorsque le segment de mémoire GC est volumineux. N’utilisez pas cette commande dans les environnements sensibles aux performances lorsque le segment de mémoire GC est volumineux.
Synopsis
dotnet-gcdump collect [-h|--help] [-p|--process-id <pid>] [-o|--output <gcdump-file-path>] [-v|--verbose] [-t|--timeout <timeout>] [-n|--name <name>]
Options
-h|--help
Affiche l’aide de la ligne de commande.
-p|--process-id <pid>
ID de processus à partir duquel collecter l’image mémoire GC.
-o|--output <gcdump-file-path>
Chemin d’accès où les images mémoires GC collectés doivent être écrites. La valeur par défaut est .\YYYYMMDD_HHMMSS_<pid>.gcdump.
-v|--verbose
Sortez le journal lors de la collecte de l’image mémoire GC.
-t|--timeout <timeout>
Abandonnez la collecte de l’image mémoire GC si cela prend plus de quelques secondes. La valeur par défaut est 30.
-n|--name <name>
Nom du processus à partir duquel collecter l’image mémoire GC.
Notes
Sous Linux et macOS, cette commande s’attend à ce que l’application cible et dotnet-gcdump
partagent la même variable d’environnement TMPDIR
. Dans le cas contraire, la commande expire.
Notes
Pour collecter une image mémoire GC à l’aide de dotnet-gcdump
, il faut l’exécuter en tant que même utilisateur que l’utilisateur exécutant le processus cible ou en tant que racine. Sinon, l’outil ne parvient pas à établir une connexion avec le processus cible.
dotnet-gcdump ps
Répertorie les processus dotnet pour lesquels les images mémoires GC peuvent être collectées. dotnet-gcdump 6.0.320703 et versions ultérieures affichent également les arguments de ligne de commande que chaque processus a démarrés, le cas échéant.
Synopsis
dotnet-gcdump ps [-h|--help]
Exemple
Supposons que vous démarriez une application de longue durée à l’aide de la commande dotnet run --configuration Release
. Dans une autre fenêtre, vous exécutez la commande dotnet-gcdump ps
. La sortie que vous verrez est la suivante. Les arguments de ligne de commande, le cas échéant, sont affichés à l’aide de la version 6.0.320703 ou ultérieure de dotnet-gcdump
.
> 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>
Générez un rapport à partir d’une image mémoire GC générée précédemment ou d’un processus en cours d’exécution, puis écrivez dans stdout
.
Synopsis
dotnet-gcdump report [-h|--help] [-p|--process-id <pid>] [-t|--report-type <HeapStat>]
Options
-h|--help
Affiche l’aide de la ligne de commande.
-p|--process-id <pid>
ID de processus à partir duquel collecter l’image mémoire GC.
-t|--report-type <HeapStat>
Type de rapport à générer. Options disponibles : heapstat (valeur par défaut).
Dépanner
Il n’existe aucune information de type dans le gcdump.
Avant .NET Core 3.1, il existait un problème où un cache de type n’était pas effacé entre les gcdumps lorsqu’ils étaient appelés avec EventPipe. Les événements nécessaires à la détermination des informations de type n’ont donc pas été envoyés pour le deuxième gcdump et les suivants. Cela a été résolu dans .NET Core 3.1-preview2.
Les types COM et statique ne sont pas dans l’image mémoire GC.
Avant .NET Core 3.1, il existait un problème où les types statique et COM n’étaient pas envoyés lorsque l’image mémoire GC était appelée via EventPipe. Cela a été résolu dans .NET Core 3.1.
dotnet-gcdump
ne peut pas générer un fichier.gcdump
car il manque des informations, par exemple, [Erreur] Exception pendant gcdump : System.ApplicationException : le fichier ETL affiche le début d’une image mémoire du segment de mémoire, mais pas sa finalisation.. Ou bien, le fichier.gcdump
n’inclut pas le segment de mémoire entier.dotnet-gcdump
fonctionne en collectant la trace des événements émis par le récupérateur de mémoire lors d’une collecte induite de génération 2. Si le segment de mémoire est suffisamment volumineux ou s’il n’y a pas assez de mémoire pour mettre à l’échelle les mémoires tampons d’événement, les événements nécessaires à la reconstruction du graphique du segment de mémoire à partir de la trace peuvent être supprimés. Dans ce cas, pour diagnostiquer les problèmes liés au segment de mémoire, il est recommandé de collecter une image mémoire du processus.dotnet-gcdump
semble provoquer un problème de mémoire insuffisante dans un environnement de mémoire limitée.dotnet-gcdump
fonctionne en collectant la trace des événements émis par le récupérateur de mémoire lors d’une collecte induite de génération 2. La mémoire tampon pour la collecte d’événements appartient à l’application cible et peut atteindre 256 Mo.dotnet-gcdump
utilise également la mémoire. Si votre environnement est limité en mémoire, veillez à tenir compte de ces facteurs lors de la collecte d’un gcdump pour éviter les erreurs.