Mesurer l’utilisation de la mémoire dans Visual Studio (C#, Visual Basic, C++, F#)
Recherchez les fuites de mémoire et l'utilisation inefficace de la mémoire pendant le débogage avec l'outil de diagnostic d'utilisation de la mémoire intégré au débogueur . L’outil Utilisation de la mémoire vous permet de prendre un ou plusieurs instantanés du tas de mémoire managée et native afin de mieux comprendre l’impact de l’utilisation de la mémoire des types d’objets. Vous pouvez également analyser l’utilisation de la mémoire sans débogueur attaché ou en ciblant une application en cours d’exécution. Pour plus d’informations, consultez Exécuter des outils de profilage sur les builds de mise en production ou de débogage. 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.
Bien que vous puissiez collecter des instantanés de mémoire à tout moment dans l’outil Utilisation de la mémoire, vous pouvez utiliser le débogueur Visual Studio pour contrôler l’exécution de votre application lors de l’examen des problèmes de performances. Paramétrer les points d’arrêt, l’opération de pas-à-pas, Interrompre tout et d’autres actions du débogueur, peuvent vous aider à concentrer vos investigations en matière de performances sur les chemins de code les plus pertinents. L’exécution de ces actions pendant l’exécution de votre application peut éliminer le bruit du code qui ne vous intéresse pas et peut réduire considérablement le temps nécessaire pour diagnostiquer un problème.
Important
Les outils de diagnostic intégrés au débogueur sont pris en charge pour le développement .NET dans Visual Studio, notamment ASP.NET, ASP.NET Core, le développement natif/C++ et les applications en mode mixte (.NET et natif).
Dans ce tutoriel, vous allez :
- Réaliser des instantanés de la mémoire
- Analyser les données d’utilisation de la mémoire
Si Utilisation de la mémoire ne vous donne pas les données dont vous avez besoin, les autres outils de profilage dans le Profileur de performances fournissent des types d’informations différents qui peuvent vous être utiles. Dans de nombreux cas, le goulot d'étranglement des performances de votre application peut être dû à autre chose que votre mémoire, comme le processeur, le rendu de l'interface utilisateur ou le temps de requête réseau.
Remarque
Prise en charge des allocateurs personnalisés Le profileur de mémoire native fonctionne en collectant des données d’événements ETW d’allocation émises pendant l’exécution. Les allocateurs du KIT de développement logiciel (SDK) CRT et Windows ont été annotés au niveau source afin que leurs données d’allocation puissent être capturées. Si vous rédigez vos propres allocateurs, toutes les fonctions qui renvoient un pointeur vers la mémoire du tas nouvellement allouée peuvent être décorées avec __declspec(allocateur), comme l’illustre cet exemple pour myMalloc :
__declspec(allocator) void* myMalloc(size_t size)
Collecter les données d’utilisation de la mémoire
Ouvrez le projet que vous souhaitez déboguer dans Visual Studio et définissez un point d’arrêt dans votre application au point où vous souhaitez commencer à examiner l’utilisation de la mémoire.
Si vous avez une zone où vous soupçonnez un problème de mémoire, définissez le premier point d’arrêt avant le problème de mémoire.
Conseil
Étant donné qu’il peut être difficile de capturer le profil de mémoire d’une opération qui vous intéresse lorsque votre application alloue et désalloue fréquemment de la mémoire, définissez des points d’arrêt au début et à la fin de l’opération (ou pas à pas dans l’opération) pour trouver le point exact que la mémoire a changé.
Définissez un deuxième point d’arrêt à la fin de la fonction ou de la région de code que vous souhaitez analyser (ou après un problème de mémoire soupçonné).
La fenêtre Outils de diagnostic s’affiche automatiquement, sauf si vous l’avez désactivée. Pour réafficher la fenêtre, cliquez sur Déboguer>Fenêtres>Afficher les Outils de diagnostic.
Choisissez Utilisation de la mémoire avec Sélectionner les outils dans la barre d’outils.
Cliquez sur Déboguer / Démarrer le débogage (ou Démarrer dans la barre d’outils ou F5).
Une fois le chargement terminé, l’affichage Résumé des outils de diagnostic s’affiche.
capture d’écran
Remarque
Étant donné que la collecte de données de mémoire peut affecter les performances de débogage de vos applications natives ou en mode mixte, les instantanés de mémoire sont désactivés par défaut. Pour activer les captures instantanées dans les applications natives ou en mode mixte, démarrez une session de débogage (touche de raccourci : F5). Quand la fenêtre Outils de diagnostic apparaît, choisissez l’onglet Utilisation de la mémoire, puis choisissez Profilage du tas.
Arrêtez (touche de raccourci : Maj+F5) et redémarrez le débogage.
capture d’écran
Remarque
Étant donné que la collecte de données de mémoire peut affecter les performances de débogage de vos applications natives ou en mode mixte, les instantanés de mémoire sont désactivés par défaut. Pour activer les captures instantanées dans les applications natives ou en mode mixte, démarrez une session de débogage (touche de raccourci : F5). Quand la fenêtre Outils de diagnostic apparaît, choisissez l’onglet Utilisation de la mémoire, puis choisissez Profilage du tas.
Arrêtez (touche de raccourci : Maj+F5) et redémarrez le débogage.
Pour prendre un instantané au début de votre session de débogage, choisissez Prendre un instantané dans la barre d’outils abrégée Utilisation de la mémoire. (Il peut également aider à définir un point d’arrêt ici.)
Conseil
Pour créer une base de référence pour les comparaisons de mémoire, envisagez de prendre un instantané au début de votre session de débogage.
Exécutez le scénario qui doit provoquer le premier point d’arrêt.
Quand le débogueur est en pause sur le premier point d’arrêt, choisissez Prendre un instantané dans la barre d’outils récapitulative Utilisation de la mémoire.
Appuyez sur F5 pour exécuter l'application jusqu'à votre deuxième point d'arrêt.
À présent, capturez un autre instantané.
À ce stade, vous pouvez commencer à analyser les données.
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.
Analyser les données d’utilisation de la mémoire
Les lignes du tableau récapitulatif de l'utilisation de la mémoire répertorient les instantanés que vous avez pris pendant la session de débogage, et elles fournissent des liens vers des vues plus détaillées.
Le nom de la colonne dépend du mode de débogage que vous choisissez dans les propriétés du projet : .NET, natif ou mixte (à la fois .NET et natif).
La colonne Objects (Diff) (.NET) ou Allocations (Diff) (C++) affiche le nombre d’objets en mémoire .NET ou native lorsque l’instantané a été pris.
La colonne Taille du tas (Diff.) montre le nombre d’octets dans les tas .NET et natif
Dès que vous aurez pris plusieurs instantanés, les cellules du tableau récapitulatif intégreront la différence de valeur entre l’instantané d’une ligne et l’instantané précédent.
Pour analyser l’utilisation de la mémoire, cliquez sur l’un des liens qui ouvrent un rapport détaillé sur l’utilisation de la mémoire :
- Pour afficher les détails de la différence entre l’instantané actuel et l’instantané précédent, choisissez le lien de modification à gauche de la flèche (
). Une flèche rouge indique une augmentation de l’utilisation de la mémoire et une flèche verte indique une diminution.
Conseil
Pour faciliter l’identification des problèmes de mémoire plus rapidement, les rapports de différences sont triés par types d’objets qui ont augmenté le plus en nombre global (cliquez sur le lien de modification dans Objets (Diff) colonne) ou qui ont augmenté le plus dans la taille globale du tas (cliquez sur le lien de modification dans Taille du tas (Diff) colonne).
Pour afficher les détails de l’instantané sélectionné uniquement, cliquez sur le lien sans modification.
Le rapport apparaît dans une fenêtre distincte.
Rapports sur les types managés
Choisissez le lien actif d’une cellule Objets (Diff.) dans le tableau récapitulatif 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 Types Référencés affiche les références détenues par le type sélectionné dans le panneau supérieur.
L’arborescence Types référencés affiche les références qui sont détenues par le type sélectionné dans le volet du haut.
Pour afficher les instances d’un type sélectionné dans le volet supérieur, cliquez sur l’icône Afficher les instances en regard du type d’objet.
La vue Instances affiche les instances de l’objet sélectionné dans l’instantané dans le volet supérieur. Le volet Chemins d’accès à la racine et Objets référencés affiche les objets qui référencent l’instance sélectionnée ainsi que les types que l’instance sélectionnée référence. Quand le débogueur est arrêté du point où l’instantané a été pris, vous pouvez pointer sur la cellule Valeur pour afficher les valeurs de l’objet dans une info-bulle.
La vue Instances affiche les instances de l’objet sélectionné dans l’instantané dans le volet supérieur. Le volet Chemins vers la racine et Objets référencés affiche les objets qui référencent l’instance sélectionnée ainsi que les types que l’instance sélectionnée référence. Quand le débogueur est arrêté du point où l’instantané a été pris, vous pouvez pointer sur la cellule Valeur pour afficher les valeurs de l’objet dans une info-bulle.
Rapports sur les 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 Vue des piles dans la liste Mode Affichage pour afficher la pile d’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 informations automatiques applicables, telles que Chaînes dupliquées, Tableaux épars et 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 performance 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 détiennent. 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 tableau récapitulatif de l'onglet Utilisation de la mémoire de la fenêtre Outils de diagnostic.
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).
Blogs et vidéos
Analyser le processeur et la mémoire pendant le débogage
blog Visual C++ : Profilage de la mémoire dans Visual C++ 2015
Étapes suivantes
Dans ce tutoriel, vous avez appris à collecter et analyser les données d’utilisation de la mémoire. Si vous avez déjà effectué la visite guidée du profileur, vous pouvez lire une approche générale de l’optimisation du code à l’aide des outils de profilage.
Dans ce tutoriel, vous avez appris à collecter et analyser les données d’utilisation de la mémoire lors du débogage. Vous souhaiterez peut-être en savoir plus sur l’analyse de l’utilisation de la mémoire dans les builds de mise en production à l’aide du Profileur de performances.