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 :
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).
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.
Dans la barre de menus, sélectionnez Déboguer>Profileur de performances.
Sous Outils disponibles, sélectionnez Utilisation de la mémoire, puis sélectionnez Démarrer.
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.
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.
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.
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.
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.
Pour C++, la colonne Objects (Diff) est nommée Allocations (Diff).
Image | Description |
---|---|
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. | |
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. | |
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. | |
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. |
Image | Description |
---|---|
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. | |
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. | |
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. | |
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.
Remarque
Pour le code .NET, l’icône Instances de vue 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.
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.
L’arborescence Types Référencés affiche les références conservées par le type sélectionné dans le volet supérieur.
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.
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.
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.)
Choisissez l’icône d’instances () 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 .
Choisissez Affichage des piles dans la liste Mode Affichage pour afficher la pile des allocations pour le type sélectionné.
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.
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.
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.
Choisissez un instantané dans la liste Comparer à d’un rapport sur la mémoire managée ou native.
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 :
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).