Partage via


Analyser l’utilisation de la mémoire dans les builds de mise en production (C#, Visual Basic, C++, F#)

L’outil Utilisation de la mémoire surveille l’utilisation de la mémoire de votre application. Vous pouvez utiliser l’outil pour étudier les effets de mémoire en temps réel des scénarios que vous développez activement dans Visual Studio. Vous pouvez prendre des captures instantanées détaillées des états de mémoire de l’application et comparer les instantanés pour rechercher 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 exécuter sur les builds de mise en production ou de débogage. Dans cet article, nous montrons comment utiliser l’outil Utilisation de la mémoire dans Visual Studio Performance Profiler, 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.

Pour une expérience optimale avec cette documentation, choisissez votre langage de développement ou runtime préféré dans la liste en haut de l’article.

Sessions de diagnostic d’utilisation de la mémoire

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

  1. Ouvrez un projet dans Visual Studio.

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

  2. Dans le menu Débogage, définissez la configuration de la solution sur Release, puis sélectionnez Débogueur Windows local (ou machine locale) 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 sélectionnez Démarrer.

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

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

Surveiller l’utilisation de la mémoire

Lorsque vous démarrez une session de diagnostic, votre application démarre et la fenêtre Diagnostic Tools affiche un graphique de chronologie de l’utilisation de la mémoire de votre application.

Capture d’écran de la fenêtre Outils de diagnostic dans Visual Studio Performance Profiler montrant un graphique de chronologie de l’utilisation de la mémoire de l’application.

Capture d’écran de la fenêtre Outils de diagnostic dans visual Studio Performance Profiler montrant un graphique de chronologie de l’utilisation de la mémoire de l’application. Vue d’ensemble du rapport de mémoire

Le graphique de chronologie affiche les fluctuations de mémoire à mesure que l’application s’exécute. Les pics dans le graphique indiquent généralement que du code collecte ou crée des données, puis l’ignore lorsque le traitement est effectué. Les pics importants 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 mémoire de l’application

Une application utilise un grand nombre d’objets et vous souhaiterez peut-être concentrer votre analyse sur un scénario. Vous pouvez également trouver des problèmes de mémoire à examiner. Vous pouvez prendre des instantanés pendant une session de diagnostic pour capturer l’utilisation de la mémoire à des moments particuliers. Il est judicieux d’obtenir un instantané de base d’une application avant qu’un problème de mémoire ne s’affiche. Vous pouvez prendre un autre instantané après la première occurrence du problème et des captures instantanées supplémentaires si vous pouvez répéter le scénario.

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

Capture d’écran de la prise d’un instantané.

Fermer la session de diagnostic

Pour arrêter une session d’analyse sans créer de rapport, fermez simplement la fenêtre de diagnostic. Pour générer un rapport lorsque vous avez terminé la collecte ou avez pris des captures instantanées, sélectionnez Arrêter la collecte.

Capture d’écran de l’arrêt de la collecte.

Capture d’écran de l’arrêt de la collecte.

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

Rapports d’utilisation de la mémoire

Après avoir arrêté la collecte de données, l’outil Utilisation de la mémoire arrête l’application et affiche la page de vue d’ensemble Utilisation de la mémoire.

Capture d’écran de la page vue d’ensemble de l’outil Utilisation de la mémoire dans Visual Studio Performance Profiler, montrant un graphique d’utilisation de la mémoire et deux volets d’instantanés. page vue d’ensemble de l’utilisation de la mémoire

Capture d’écran de la page vue d’ensemble de l’outil Utilisation de la mémoire dans Visual Studio Performance Profiler, montrant un graphique d’utilisation de la mémoire et deux volets d’instantanés. page vue d’ensemble de l’utilisation de la mémoire

Captures instantanées d’utilisation de la mémoire

Les nombres dans les volets Capture instantanée affichent les objets et les octets en mémoire lorsque chaque instantané a été pris, et la différence entre l’instantané et la précédente.

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.

Capture d’écran des liens d’affichage instantané

Pour C++, la colonne Objects (Diff) est nommée Allocations (Diff).

Image Description
Étape 1 Nombre total d’objets en mémoire lorsque 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.
étape 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.
étape 3 Nombre total d’octets en mémoire lorsque 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.
étape 4 Différence entre la taille totale des objets de mémoire dans cet instantané et l’instantané précédent. Un nombre positif signifie que la taille de mémoire de cet instantané est supérieure à celle précédente, et qu’un nombre négatif signifie que la taille est plus petite. 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 égale à zéro. Sélectionnez ce lien pour afficher un rapport de différences instantané, trié selon l'écart dans la taille totale des instances des différents types.

Liens de capture instantanée

Image Description
Étape 1 Nombre total d’octets en mémoire lorsque 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.
étape 2 Nombre total d’objets en mémoire lorsque l’instantané a été pris. Sélectionnez ce lien pour afficher un rapport détaillé de l’instantané, trié par le nombre d'occurrences de chaque type.
étape 3 Différence entre la taille totale des objets de mémoire dans cet instantané et l’instantané précédent. Un nombre positif signifie que la taille de mémoire de cet instantané est supérieure à celle précédente, et qu’un nombre négatif signifie que la taille est plus petite. 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 égale à zéro. 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.
étape 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.

Rapports sur les types managés

Choisissez le lien actuel d'une cellule Objects (Diff) dans le tableau récapitulatif de l'utilisation de la mémoire.

Capture d’écran du rapport de type managé.

Remarque

Pour le code .NET, l’icône Instances de vueIcône Instances dans la colonne Type d’objet n’est disponible que lors de l’utilisation de l’outil Utilisation de la mémoire intégré au débogueur ou lorsque vous ouvrez un instantané de tas et choisissez Déboguer la mémoire managée.

Le volet supérieur affiche le nombre et la taille des types dans l’instantané, y compris la taille de tous les objets référencés par le type (Taille inclusive).

L’arborescence Chemins d’accès à la racine dans le volet inférieur affiche les objets qui font référence au type sélectionné dans le volet supérieur. Le garbage collector .NET nettoie la mémoire d’un objet uniquement lorsque le dernier type qui fait référence à celui-ci a été libéré. Pour plus d’informations sur l’utilisation de l’arborescence Chemins vers la racine, consultez Analyser le chemin chaud vers la racine.

Capture d’écran du rapport de type managé.

Le volet supérieur affiche le nombre et la taille des types dans l’instantané, y compris la taille de tous les objets référencés par le type (Taille inclusive).

L’arborescence Chemins d’accès à la racine dans le volet inférieur affiche les objets qui font référence au type sélectionné dans le volet supérieur. Le garbage collector .NET nettoie la mémoire d’un objet uniquement lorsque le dernier type qui fait référence à celui-ci a été libéré.

L’arborescence des types référencés affiche les références détenues par le type sélectionné dans le volet supérieur.

Capture d’écran du rapport Objets référencés.

L’arborescence Types Référencés affiche les références conservées par le type sélectionné dans le volet supérieur.

Capture d’écran du rapport Objets référencés.

Filtres des arborescences de rapport

De nombreux types dans les applications ne sont pas nécessaires pour que les développeurs d'applications examinent les problèmes de mémoire. 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.

Options de tri et filtrage

options de tri et de filtre

  • Pour filtrer une arborescence par nom de type, entrez le nom dans la zone Filtrer. 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 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 au système d’exploitation ou aux composants du framework, ou sont générés par le compilateur.

  • 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.

Rapports de types natifs

Cliquez sur le lien actif d’une cellule Allocations (Diff.) ou Taille du tas (Diff.) dans le tableau récapitulatif Utilisation de la mémoire de la fenêtre Outils de diagnostic.

Capture d’écran de la vue de type natif.

Capture d’écran de la vue Type natif.

La vue types affiche le nombre et la taille des types dans l’instantané.

  • Choisissez l’icône Afficher les instances en regard d’un type sélectionné pour afficher des informations sur les objets du type sélectionné dans l’instantané.

    La vue Instances affiche chaque instance du type sélectionné. La sélection d’une instance affiche la pile des appels qui a entraîné la création de l’instance dans le volet Pile des appels d’allocation . (Ces informations sont disponibles uniquement pendant le débogage.)

    Capture d’écran de la vue Instances et du volet Pile des appels d’allocation.

  • Choisissez l’icône d’instances (Icône d’instance dans la colonne Type d’objet) d’un type sélectionné pour afficher des informations sur les objets du type sélectionné dans l’instantané.

    La vue Instances affiche chaque instance du type sélectionné. La sélection d’une instance affiche la pile des appels qui a entraîné la création de l’instance dans le volet Pile des appels d’allocation .

    Capture d’écran de la vue Instances et du volet Pile des appels d’allocation.

  • Choisissez Piles si vous voulez afficher la pile des allocations pour le type sélectionné.

    Capture d’écran de la vue Piles.

  • Choisissez Affichage des piles dans la liste Mode Affichage pour afficher la pile des allocations pour le type sélectionné.

    Capture d’écran de la vue Piles.

Aperçus sur l’utilisation de la mémoire

Pour la mémoire managée, l’outil Analyse de la mémoire fournit également plusieurs insights automatiques intégrés puissants. Sélectionnez l’onglet Insights dans les rapports de types managés. Celui-ci montre les insights automatiques applicables, tels que Chaînes dupliquées, Tableaux éparset Fuites de gestionnaire d’événements.

Capture d’écran de la vue des insights dans l’Outil d’Utilisation de la Mémoire.

La section Chaînes dupliquées affiche la liste des chaînes qui sont allouées plusieurs fois sur le tas. En outre, cette section affiche la mémoire totale gaspille, autrement dit le (nombre d’instances - 1) fois la taille de la chaîne.

La section Tableaux clairsemés présente les tableaux qui sont principalement remplis d'éléments nuls, ce qui peut être inefficace en termes de performances et d'utilisation de la mémoire. L’outil d’analyse de la mémoire détecte automatiquement ces tableaux et vous indique la quantité de mémoire gaspille en raison de ces valeurs nulles.

La section Event Handler Leaks, disponible dans Visual Studio 2022 version 17.9 Preview 1, affiche des fuites de mémoire potentielles qui peuvent se produire lorsqu’un objet s’abonne à l’événement d’un autre objet. Si l’éditeur de l’événement survit à l’abonné, ce dernier reste actif, même s’il n’existe pas d’autre référence à celui-ci. Cela peut entraîner des fuites de mémoire, où la mémoire inutilisée n’est pas correctement libérée, ce qui entraîne l’utilisation de l’application plus et plus de mémoire au fil du temps.

Certains types sont connus pour avoir des champs qui peuvent être lus pour déterminer la taille de la mémoire native qu'ils gèrent. L’onglet Insights affiche des nœuds de mémoire natif faux dans le graphique d’objets, qui sont conservés par leurs objets parents afin que l’interface utilisateur les reconnaisse et affiche leur taille et leur graphique de référence.

Capture d’écran de la vue d'aperçu native dans l’outil Utilisation de la mémoire.

Rapports sur les modifications (Différences)

  • Choisissez le lien de modification dans une cellule du volet de capture instantanée dans la page vue d’ensemble de l’utilisation de la mémoire.

    Capture d’écran de Choisir un lien de modification dans une cellule.

    Capture d’écran de Choisir un lien de modification dans une cellule.

  • Choisissez un instantané dans la liste Comparer à d’un rapport sur la mémoire managée ou native.

    Capture d’écran de Choisissez un instantané dans la liste Comparer avec.

    Capture d’écran de Choisir un instantané dans la liste Comparer à.

Le rapport de modification ajoute des colonnes (marquées avec (Diff)) au rapport de base qui affiche la différence entre la valeur d’instantané de base et l’instantané de comparaison. Voici à quoi peut ressembler un rapport des différences de la vue des types natifs :

Capture d’écran des vues des différences des Types natifs.

Capture d’écran des vues des différences des Types natifs.

Le volet supérieur affiche le nombre et la taille des types dans l’instantané, y compris la taille de tous les objets référencés par le type (Taille inclusive).