Analyser l’utilisation de la mémoire sans débogage dans le Profileur de performances (C#, Visual Basic, C++, F#)

L’outil Utilisation de la mémoire permet de superviser l’utilisation de la mémoire par votre application. Vous pouvez l’utiliser pour étudier les effets en temps réel sur la mémoire des scénarios que vous développez activement dans Visual Studio. Vous pouvez prendre des instantanés des états de la mémoire de l’application, et comparer les instantanés pour trouver les causes racines des problèmes de mémoire. L’outil Utilisation de la mémoire est pris en charge sur les applications .NET, ASP.NET, C++ ou en mode mixte (.NET et natif).

L’outil Utilisation de la mémoire peut s’exécuter avec ou sans le débogueur. Dans cet article, nous montrons comment utiliser l’outil Utilisation de la mémoire sans le débogueur dans le Profileur de performances de Visual Studio, ce qui est recommandé pour les builds de mise en production. Pour plus d’informations sur le choix de l’outil d’analyse de mémoire le mieux adapté à vos besoins, consultez Choisir un outil d’analyse de la mémoire.

Sessions de diagnostic d’utilisation de la mémoire

Pour démarrer une session de diagnostic d’utilisation de la mémoire

  1. Ouvrir un projet dans Visual Studio.

    L’outil Utilisation de la mémoire prend en charge les applications .NET, ASP.NET, C++ ou en mode mixte (.NET et natif).

  2. Dans le menu Déboguer, définissez la configuration de la solution sur Mise en production et sélectionnez Débogueur Windows local (ou Ordinateur local) comme cible de déploiement.

  3. Dans la barre de menus, sélectionnez Déboguer>Profileur de performances.

  4. Sous Outils disponibles, sélectionnez Utilisation de la mémoire, puis Démarrer.

    Start a Memory Usage diagnostic session

Surveiller l'utilisation de la mémoire

Quand vous démarrez une session de diagnostic, votre application démarre et la page Outils de diagnostic affiche un graphe chronologique de l’utilisation de la mémoire par votre application.

Screenshot of the Diagnostic Tools window in the Visual Studio Performance Profiler showing a timeline graph of the app's memory use.

Screenshot of the Diagnostic Tools window in the Visual Studio Performance Profiler showing a timeline graph of the app's memory use.

Le graphe de chronologie montre les fluctuations de la mémoire durant l’exécution de l’application. Les pointes du graphe indiquent généralement que du code collecte ou crée des données, puis les supprime une fois le traitement terminé. Les pointes prononcées indiquent des zones que vous pouvez optimiser. La principale préoccupation est une augmentation de la consommation de mémoire qui n’est pas retournée. Cela peut indiquer une utilisation inefficace de la mémoire ou même une fuite de mémoire.

Prendre des instantanés des états de la mémoire d’application

Une application utilise un grand nombre d’objets, et vous souhaiterez peut-être concentrer votre analyse sur un seul scénario. Ou il se peut que vous détectiez des problèmes de mémoire à examiner. Vous pouvez prendre des instantanés pendant une session de diagnostic afin de capturer l’utilisation de la mémoire à des moments précis. Il est recommandé d’obtenir un instantané de base d’une application avant qu’un problème de mémoire n’apparaisse. Vous pouvez prendre un autre instantané après la première occurrence du problème, et des instantanés supplémentaires si vous pouvez répéter le scénario.

Pour recueillir des instantanés, sélectionnez Prendre un instantané quand vous souhaitez capturer les données de mémoire.

Fermer la session de diagnostic

Pour arrêter une session de surveillance sans créer de rapport, fermez simplement la fenêtre de diagnostic. Pour générer un rapport quand vous avez terminé la collecte ou la prise d’instantanés, sélectionnez Arrêter la collecte.

Stop Collection

Si vous rencontrez des problèmes lors de la collecte ou de l’affichage des données, consultez Résoudre les erreurs de profilage et corriger les problèmes.

Rapports d’utilisation de la mémoire

Une fois que vous avez arrêté la collecte des données, l’outil Utilisation de la mémoire arrête l’application et affiche la page de vue d’ensemble d’Utilisation de la mémoire.

Screenshot of the overview page in the Memory Usage tool in the Visual Studio Performance Profiler, showing a memory usage graph and two snapshot panes.

Screenshot of the overview page in the Memory Usage tool in the Visual Studio Performance Profiler, showing a memory usage graph and two snapshot panes.

Instantanés d’utilisation de la mémoire

Les chiffres mentionnés dans les volets Instantané indiquent les objets et octets en mémoire quand chaque instantané a été réalisé ainsi que la différence entre cet instantané et le précédent.

Les chiffres sont des liens qui permettent d’ouvrir des vues de rapports détaillées d’Utilisation de la mémoire dans de nouvelles fenêtres Visual Studio. Un rapport de détails d’instantané montre les types et les instances d’un seul instantané. Un rapport de différences d’instantanés compare les types et les instances de deux instantanés.

Snapshot view links

Image Description
Step 1 Nombre total d’octets en mémoire au moment où l’instantané a été pris. Sélectionnez ce lien pour afficher un rapport détaillé de l’instantané, trié d’après la taille totale des instances du type.
Step 2 Nombre total d’objets en mémoire au moment où l’instantané a été pris. Sélectionnez ce lien pour afficher un rapport détaillé de l’instantané, trié d’après le nombre total d’instances des types.
Step 3 Différence entre la taille totale des objets mémoire dans cet instantané et l’instantané précédent. Un nombre positif signifie que la taille en mémoire de cet instantané est supérieure à celle du précédent, et un nombre négatif signifie l’inverse. Base de référence signifie qu’un instantané est le premier dans une session de diagnostic. Aucune différence signifie que la différence est nulle. Sélectionnez ce lien pour afficher un rapport différentiel des instantanés, trié d’après la différence de taille totale des instances des types.
Step 4 Différence entre le nombre total d’objets mémoire dans cet instantané et l’instantané précédent. Sélectionnez ce lien pour afficher un rapport de différences d’instantané. Il est trié par la différence dans le nombre total d’instances des types.

Snapshot view links

Image Description
Step 1 Nombre total d’objets en mémoire au moment où l’instantané a été pris. Sélectionnez ce lien pour afficher un rapport détaillé de l’instantané, trié d’après le nombre total d’instances des types.
Step 2 Différence entre le nombre total d’objets mémoire dans cet instantané et l’instantané précédent. Sélectionnez ce lien pour afficher un rapport différentiel des instantanés, trié d’après la différence du nombre total des instances des types.
Step 3 Nombre total d’octets en mémoire au moment où l’instantané a été pris. Sélectionnez ce lien pour afficher un rapport détaillé de l’instantané, trié d’après la taille totale des instances du type.
Step 4 Différence entre la taille totale des objets mémoire dans cet instantané et l’instantané précédent. Un nombre positif signifie que la taille en mémoire de cet instantané est supérieure à celle du précédent, et un nombre négatif signifie l’inverse. Base de référence signifie qu’un instantané est le premier dans une session de diagnostic. Aucune différence signifie que la différence est nulle. Sélectionnez ce lien pour afficher un rapport différentiel des instantanés, trié d’après la différence de taille totale des instances des types.

Rapports d’instantanés d’utilisation de la mémoire

Quand vous sélectionnez l’un des liens d’instantané dans la page de vue d’ensemble Utilisation de la mémoire, un rapport d’instantané s’ouvre dans une nouvelle page.

Memory Usage snapshot report

Memory Usage snapshot report

Si un Type d’objet est bleu, vous pouvez le sélectionner pour accéder à l’objet dans le code source, dans une fenêtre distincte.

Les types que vous ne pouvez pas identifier ou dont vous ne comprenez pas l’implication dans votre code sont probablement des objets du compilateur, de .NET ou du système d’exploitation. L’ outil Utilisation de la mémoire affiche ces objets s’ils sont impliqués dans les chaînes de propriétés de vos objets.

Dans le rapport d’instantané :

  • L’arborescence Mémoire managée montre les types et instances du rapport. La sélection d’un type ou d’une instance affiche les arborescences Chemins d’accès à la racine et Objets référencés pour l’élément sélectionné.

  • L’arborescence Chemins d’accès à la racine montre la chaîne d’objets qui référencent un type ou une instance. Le récupérateur de mémoire .NET nettoie la mémoire d’un objet uniquement quand toutes les références à cet objet ont été libérées.

  • L’arborescence Types référencés ou Objets référencés montre les objets référencés par le type ou l’instance sélectionné.

Filtres des arborescences de rapport

De nombreux types dans les applications ne sont pas nécessaires pour les développeurs d’applications. Les filtres de rapport d’instantané peuvent masquer la plupart de ces types dans les arborescences Mémoire managée et Chemins d’accès à la racine.

Sort and filter options

Sort and filter options

  • Pour filtrer une arborescence par nom de type, entrez le nom dans la zone Filtre. Le filtre ne respecte pas la casse, et il reconnaît la chaîne spécifiée dans toutes les parties du nom de type.

  • Sélectionnez Réduire les petits objets dans la liste déroulante Filtre pour masquer les types dont la Taille (octets) est inférieure à 0,5 % de la mémoire totale.

  • Sélectionnez Uniquement mon code dans la liste déroulante Filtre pour masquer la plupart des instances qui sont générées par du code externe. Les types externes appartiennent aux composants de framework ou de système d’exploitation, ou ils sont générés par le compilateur.

Rapports détaillés d'instantané

Un rapport détaillé d’instantané décrit un instantané spécifique d’une session de diagnostic. Pour ouvrir le rapport, sélectionnez le lien de taille ou d’objets dans un volet de l’instantané.

Links to snapshot report in a snapshot pane

Links to snapshot report in a snapshot pane

Les deux liens ouvrent le même rapport. La seule différence concerne l’ordre de tri de départ de l’arborescence Mémoire managée. Le lien de taille trie le rapport en fonction de la colonne Taille inclusive (octets). Le lien d’objets trie le rapport en fonction de la colonne Nombre. Vous pouvez changer l’ordre ou la colonne de tri après l’ouverture du rapport.

Arborescence Mémoire managée (rapports de détails de l’instantané)

L’arborescence Mémoire managée répertorie les types d’objets contenus dans la mémoire. Développez le nom d’un type pour afficher les dix instances du type les plus volumineuses, triées par taille. Sélectionnez un type ou une instance pour afficher les arborescences Chemins d’accès à la racine et Objets référencés pour l’élément sélectionné.

Managed Heap tree

Managed Memory tree

L’arborescence Mémoire managée dans un rapport détaillé d’instantané comporte les colonnes suivantes :

Nom Description
Type d'objet Nom du type ou instance de l'objet.
Count Nombre d'instances d'objet du type. La valeur Nombre est toujours égale à 1 pour une instance.
Taille (octets) Pour un type, la taille de toutes les instances du type dans l’instantané, moins la taille des objets contenus dans les instances. Pour une instance, la taille de l’objet, moins la taille des objets contenus dans l’instance.
Taille inclusive (octets) Taille des instances du type ou taille d’une seule instance, y compris la taille des objets contenus.
Module Module qui contient l’objet.

Arborescence Chemins d’accès à la racine (rapports de détails de l’instantané)

L’arborescence Chemins d’accès à la racine montre la chaîne d’objets qui référencent un type ou une instance. Le récupérateur de mémoire .NET nettoie la mémoire d’un objet uniquement quand toutes les références à cet objet ont été libérées.

Pour un type dans l’arborescence Chemins d’accès à la racine, le nombre d’objets qui comportent des références à ce type est affiché dans la colonne Nombre de références.

Paths to Root tree for types

Paths to Root tree for types

Arborescence Types référencés ou Objets référencés (rapports détaillés de l’instantané)

L’arborescence Types référencés ou Objets référencés montre les objets référencés par le type ou l’instance sélectionné.

Referenced Objects tree for instances

Referenced Objects tree for instances

Une arborescence Types référencés dans un rapport détaillé d’instantané comporte les colonnes suivantes. Une arborescence Objets référencés n’a pas de colonne Nombre de références.

Nom Description
Type d’objet ou Instance Nom du type ou de l’instance.
Nombre de références Pour les types, nombre d’instances d’objets du type.
Taille (octets) Pour un type, taille de toutes les instances du type, moins la taille des objets contenus dans le type. Pour une instance, taille de l’objet, moins la taille des objets contenus dans l’objet.
Taille inclusive (octets) Taille totale des instances du type ou taille de l’instance, y compris la taille des objets contenus.
Module Module qui contient l’objet.

Rapports différentiels d'instantanés

Un rapport différentiel d’instantanés montre les changements entre un instantané principal et l’instantané précédent. Pour ouvrir un rapport différentiel, sélectionnez l’un des liens de différence dans un volet d’instantané.

Les deux liens ouvrent le même rapport. La seule différence concerne l’ordre de tri de départ de l’arborescence Mémoire managée dans le rapport. Le lien de taille trie le rapport en fonction de la colonne Différence de taille inclusive (octets). Le lien d’objets trie le rapport en fonction de la colonne Différence de nombre. Vous pouvez changer l’ordre ou la colonne de tri après l’ouverture du rapport.

Links to difference report in a snapshot pane

Links to difference report in a snapshot pane

Arborescence Mémoire managée (rapports différentiels d’instantanés)

L’arborescence Mémoire managée répertorie les types d’objets contenus dans la mémoire. Vous pouvez développer le nom d’un type pour afficher les dix instances du type les plus volumineuses, triées par taille. Sélectionnez un type ou une instance pour afficher les arborescences Chemins d’accès à la racine et Objets référencés pour l’élément sélectionné.

Managed Heap tree for a type in difference report

Managed Memory tree for a type in difference report

L’arborescence Mémoire managée dans un rapport différentiel d’instantanés comporte les colonnes suivantes :

Nom Description
Type d'objet Nom du type ou instance de l'objet.
Count Nombre d'instances d'un type dans l'instantané principal. La valeur Nombre est toujours égale à 1 pour une instance.
Différence de nombre Pour un type, différence du nombre d'instances du type entre l'instantané principal et l'instantané précédent. Le champ est vide pour une instance.
Taille (octets) Taille des objets dans l’instantané principal, moins la taille des objets dans les objets. Pour un type, Taille (octets) et Taille inclusive (octets) sont les totaux des tailles des instances du type.
Diff. taille totale (octets) Pour un type, différence de taille totale des instances du type entre l’instantané principal et l’instantané précédent, moins la taille des objets dans les instances. Le champ est vide pour une instance.
Taille inclusive (octets) Taille des objets dans l’instantané principal, y compris la taille des objets dans les objets.
Diff. de taille inclusive (octets) Pour un type, différence de taille de toutes les instances du type entre l’instantané principal et l’instantané précédent, y compris la taille des objets dans les objets. Le champ est vide pour une instance.
Module Module qui contient l’objet.

Arborescence Chemins d’accès à la racine (rapports différentiels d’instantanés)

L’arborescence Chemins d’accès à la racine montre la chaîne d’objets qui référencent un type ou une instance. Le récupérateur de mémoire .NET nettoie la mémoire d’un objet uniquement quand toutes les références à cet objet ont été libérées.

Pour un type dans l’arborescence Chemins d’accès à la racine, le nombre d’objets qui comportent des références à ce type est affiché dans la colonne Nombre de références. La différence de nombre par rapport à l’instantané précédent se trouve dans la colonne Différence au niveau du nombre de références.

Paths To Root tree in a diff report

Paths To Root tree in a diff report

Arborescence Types référencés ou Objets référencés (rapports différentiels d’instantanés)

L’arborescence Types référencés ou Objets référencés montre les objets référencés par le type ou l’instance sélectionné.

Referenced Types in a diff report

Referenced Types in a diff report

Une arborescence Types référencés dans un rapport différentiel d’instantanés comporte les colonnes suivantes. Une arborescence Objets référencés comporte les colonnes Instance, Taille (octets), Taille Inclusive (octets) et Module.

Nom Description
Type d’objet ou Instance Nom du type ou instance de l'objet.
Nombre de références Nombre d'instances d'un type dans l'instantané principal.
Différence au niveau du nombre de références Pour un type, différence du nombre d'instances du type entre l'instantané principal et l'instantané précédent.
Taille (octets) Taille des objets dans l’instantané principal, moins la taille des objets dans les objets. Pour un type, Taille (octets) et Taille inclusive (octets) sont les totaux des tailles des instances du type.
Diff. taille totale (octets) Pour un type, différence de taille totale des instances du type entre l’instantané principal et l’instantané précédent, moins la taille des objets dans les instances.
Taille inclusive (octets) Taille des objets dans l’instantané principal, y compris la taille des objets dans les objets.
Diff. de taille inclusive (octets) Pour un type, différence de taille de toutes les instances du type entre l’instantané principal et l’instantané précédent, y compris la taille des objets dans les objets.
Module Module qui contient l’objet.

Rapport d’insights

Dans Visual Studio 2022, l’outil Analyse de la mémoire fournit également plusieurs insights automatiques intégrés puissants pour la mémoire managée. Sélectionnez l’onglet Insights dans les rapports de types managés et affiche les insights automatiques applicables, tels que chaînes dupliquées, tableaux éparset fuites de gestionnaires d’événements. Pour plus d’informations, consultez Informations sur l’utilisation de la mémoire.

Screenshot of Managed memory insights.