Profiler l’utilisation de la mémoire dans Visual StudioProfile Memory Usage in Visual Studio

Recherchez les fuites de mémoire et les utilisations inefficaces de la mémoire durant le débogage avec l’outil de diagnostic Utilisation de la mémoire intégré au débogueur.Find memory leaks and inefficient memory while you're debugging with the debugger-integrated Memory Usage diagnostic tool. 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.The Memory Usage tool lets you take one or more snapshots of the managed and native memory heap to help understand the memory usage impact of object types. Vous pouvez collecter des instantanés d’applications .NET, natives ou en mode mixte (.NET et native).You can collect snapshots of .NET, native, or mixed mode (.NET and native) apps.

L’illustration suivante montre la fenêtre Outils de diagnostic (disponible dans Visual Studio 2015 Update 1 et ultérieur) :The following graphic shows the Diagnostic Tools window (available in Visual Studio 2015 Update 1 and later versions):

DiagnosticTools-Update1DiagnosticTools-Update1

Bien que vous puissiez collecter des instantanés de la mémoire à tout moment dans l’outil Utilisation de la mémoire , vous pouvez utiliser le débogueur Visual Studio pour contrôler la façon dont votre application s’exécute lors de l’examen des problèmes de performances.Although you can collect memory snapshots at any time in the Memory Usage tool, you can use the Visual Studio debugger to control how your application executes while investigating performance issues. La définition de points d’arrêt, l’exécution 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 du code qui sont les plus pertinents.Setting breakpoints, stepping, Break All, and other debugger actions can help you focus your performance investigations on the code paths that are most relevant. Le fait d’effectuer ces actions pendant l’exécution de votre application peut éliminer le bruit du code qui ne vous intéresse pas et réduire considérablement le temps nécessaire pour diagnostiquer un problème.Performing those actions while your app is running can eliminate the noise from the code that doesn't interest you and can significantly reduce the amount of time it takes you to diagnose an issue.

Vous pouvez également utiliser l’outil Utilisation de la mémoire en dehors du débogueur.You can also use the memory tool outside of the debugger. Consultez Memory Usage without Debugging.See Memory Usage without Debugging.

Note

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.Custom Allocator Support The native memory profiler works by collecting allocation ETW event data emitted by during runtime. Les allocateurs dans le CRT et le Kit de développement logiciel (SDK) Windows ont été annotés au niveau de la source afin que leurs données d’allocation puissent être capturées.Allocators in the CRT and Windows SDK have been annotated at the source level so that their allocation data can be captured. Si vous écrivez vos propres allocateurs, toutes les fonctions qui retournent un pointeur vers la mémoire du tas nouvellement allouée peuvent être décorées avec __declspec(allocator), comme l’illustre cet exemple pour myMalloc :If you are writing your own allocators, then any functions that return a pointer to newly allocated heap memory can be decorated with __declspec(allocator), as seen in this example for myMalloc:

__declspec(allocator) void* myMalloc(size_t size)

Dans ce didacticiel, vous allez effectuer les actions suivantes :In this tutorial, you will:

  • Réaliser des instantanés de la mémoireTake snapshots of memory
  • Analyser l’utilisation de la mémoireAnalyze memory usage data

Collecter les données d’utilisation de la mémoireCollect memory usage data

  1. Ouvrez le projet que vous voulez déboguer dans Visual Studio, puis définissez un point d’arrêt dans votre application à l’endroit où vous voulez commencer à examiner l’utilisation de la mémoire.Open the project you want to debug in Visual Studio and set a breakpoint in your app at the point where you want to begin examining memory usage.

    Si vous suspectez un problème de mémoire dans une zone spécifique, définissez le premier point d’arrêt avant que le problème de mémoire se produise.If you have an area where you suspect a memory issue, set the first breakpoint before the memory issue occurs.

    Conseil

    Comme il peut être difficile de capturer le profil de mémoire d’une opération qui vous intéresse si votre application alloue et libère fréquemment de la mémoire, définissez des points d’arrêt au début et à la fin de l’opération (ou bien exécutez pas à pas l’opération) pour trouver le point exact où la mémoire a été modifiée.Because it can be challenging to capture the memory profile of an operation that interests you when your app frequently allocates and de-allocates memory, set breakpoints at the start and end of the operation (or step through the operation) to find the exact point that memory changed.

  2. Définissez un deuxième point d’arrêt à la fin de la fonction ou de la région de code que vous voulez analyser (ou après qu’un problème mémoire supposé se soit produit).Set a second breakpoint at the end of the function or region of code that you want to analyze (or after a suspected memory issue occurs).

  3. La fenêtre Outils de diagnostic apparaît automatiquement, sauf si vous l’avez désactivée.The Diagnostic Tools window appears automatically unless you have turned it off. Pour réafficher la fenêtre, cliquez sur Déboguer / Fenêtres / Afficher les outils de diagnostic.To bring up the window again, click Debug / Windows / Show Diagnostic Tools.

  4. Choisissez Utilisation de la mémoire avec Sélectionner les outils dans la barre d’outils.Choose Memory Usage with the Select Tools setting on the toolbar.

    Afficher les outils de diagnosticsShow Diagnostics Tools

  5. Cliquez sur Déboguer / Démarrer le débogage (ou Démarrer dans la barre d’outils, ou F5).Click Debug / Start Debugging (or Start on the toolbar, or F5).

    Lorsque l’application est chargée, la vue Résumé des outils de diagnostics s’affiche.When the app finishes loading, the Summary view of the Diagnostics Tools appears.

    Onglet Résumé des outils de diagnosticsDiagnostics Tools Summary Tab

    Note

    Comme la collecte des données de la mémoire peut affecter les performances du débogage de vos applications natives ou en mode mixte, les instantanés de la mémoire sont désactivés par défaut.Because collecting memory data can affect the debugging performance of your native or mixed-mode apps, memory snapshots are disabled by default. Pour activer les instantanés dans des applications natives ou en mode mixte, démarrez une session de débogage (touche de raccourci : F5).To enable snapshots in native or mixed-mode apps, start a debugging session (Shortcut key: F5). Quand la fenêtre Outils de diagnostic apparaît, choisissez l’onglet Utilisation de la mémoire, puis Profilage du tas.When the Diagnostic Tools window appears, choose the Memory Usage tab, and then choose Heap Profiling.

    Activer les instantanésEnable snapshots

    Arrêtez (touche de raccourci : Maj + F5) et redémarrez le débogage.Stop (Shortcut key: Shift + F5) and restart debugging.

  6. Pour prendre un instantané au début de votre session de débogage, choisissez Prendre un instantané dans la barre d’outils récapitulative Utilisation de la mémoire.To take a snapshot at the start of your debugging session, choose Take snapshot on the Memory Usage summary toolbar. (Il peut être utile de définir un point d’arrêt ici aussi.)(It may help to set a breakpoint here as well.)

    Prendre un instantanéTake snapshot

    Conseil

    Pour créer une ligne de base pour les comparaisons de mémoire, envisagez de prendre un instantané au démarrage de votre session de débogage.To create a baseline for memory comparisons, consider taking a snapshot at the start of your debugging session.

  7. Exécutez le scénario qui doit provoquer le premier point d’arrêt.Run the scenario that will cause your first breakpoint to be hit.

  8. 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.While the debugger is paused at the first breakpoint, choose Take snapshot on the Memory Usage summary toolbar.

  9. Appuyez sur F5 pour exécuter l’application jusqu’au deuxième point d’arrêt.Hit F5 to run the app to your second breakpoint.

  10. Prenez maintenant un autre instantané.Now, take another snapshot.

    À ce stade, vous pouvez commencer à analyser les données.At this point, you can begin to analyze the data.

Analyser l’utilisation de la mémoireAnalyze memory usage data

Les lignes du tableau récapitulatif Utilisation de la mémoire listent les instantanés que vous avez pris pendant la session de débogage et fournissent des liens vers des vues plus détaillées.The rows of Memory Usage summary table lists the snapshots that you have taken during the debugging session and provides links to more detailed views.

Tableau récapitulatif de la mémoireMemory summary table

Les noms des colonnes varient selon le mode de débogage que vous choisissez dans les propriétés du projet : .NET, natif ou mixte (.NET et natif).The name of the columns depend on the debugging mode you choose in the project properties: .NET, native, or mixed (both .NET and native).

  • Les colonnes Objets (Diff.) et Allocations (Diff.) montrent le nombre d’objets dans la mémoire .NET et dans la mémoire native au moment où l’instantané a été pris.The Objects (Diff) and Allocations (Diff) columns display the number of objects in .NET and native memory when the snapshot was taken.

  • La colonne Taille du tas (Diff.) montre le nombre d’octets dans les tas .NET et natif.The Heap Size (Diff) column displays the number of bytes in the .NET and native heaps

Quand vous avez pris plusieurs instantanés, les cellules de la table de résumé contiennent la différence de valeur entre l’instantané d’une ligne et l’instantané précédent.When you have taken multiple snapshots, the cells of the summary table include the change in the value between the row snapshot and the previous snapshot.

Pour analyser l’utilisation de la mémoire, cliquez sur un des liens qui ouvrent un rapport détaillé de l’utilisation de la mémoire :To analyze memory usage, click one of the links that opens up a detailed report of memory usage:

  • Pour voir les détails de la différence entre l’instantané actif et l’instantané précédent, cliquez sur le lien Modification à gauche de la flèche (Augmentation de l’utilisation de la mémoire).To view details of the difference between the current snapshot and the previous snapshot, choose the change link to the left of the arrow (Memory Usage Increase). Une flèche rouge indique une augmentation de l’utilisation de la mémoire et une flèche verte indique une baisse.A red arrow indicates an increase in memory usage, and a green arrow to indicates a decrease.

    Conseil

    Pour aider à identifier les problèmes de mémoire plus rapidement, les rapports de comparaison sont triés selon les types d’objets dont le nombre total a le plus augmenté (cliquez sur le lien de modification dans la colonne Objets (Diff.)) ou qui ont le plus augmenté dans la taille de segment totale (cliquez sur le lien de modification dans la colonne Taille du tas (Diff.)).To help identify memory issues more quickly, the diff reports are sorted by object types that increased the most in overall number (click the change link in Objects (Diff) column) or that increased the most in overall heap size (click the change link in Heap Size (Diff) column).

  • Pour afficher les détails de l’instantané sélectionné, cliquez sur le lien de non-modification.To view details of only the selected snapshot, click the non-change link.

    Le rapport s’affiche dans une fenêtre distincte.The report appears in a separate window.

Rapports sur les types managésManaged types reports

Choisissez le lien actif d’une cellule Objets (Diff.) ou Allocations (Diff.) dans le tableau récapitulatif Utilisation de la mémoire.Choose the current link of a Objects (Diff) or Allocations (Diff) cell in the Memory Usage summary table.

Rapport de type managé du Débogueur - Chemins d’accès à la racineDebugger managed type report - Paths to Root

Le volet du haut affiche le nombre et la taille des types de l’instantané, y compris la taille de tous les objets qui sont référencés par le type (Taille inclusive).The top pane shows the count and size of the types in the snapshot, including the size of all objects that are referenced by the type (Inclusive Size).

L’arborescence Chemins d’accès à la racine du volet du bas affiche les objets qui référencent le type sélectionné dans le volet du haut.The Paths to Root tree in the bottom pane displays the objects that reference the type selected in the upper pane. Le Garbage Collector .NET Framework nettoie la mémoire pour un objet seulement quand le dernier type qui le référence a été publié.The .NET Framework garbage collector cleans up the memory for an object only when the last type that references it has been released.

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.The Referenced Types tree displays the references that are held by the type selected in the upper pane.

Affichage du rapport des types référencés managésManaged eferenced types report view

Pour afficher les instances d’un type sélectionné dans le volet du haut, choisissez l’icône Icône d’instance.To display the instances of a selected type in the upper pane, choose the Instance icon icon.

Vue InstancesInstances view

La vue Instances affiche les instances de l’objet sélectionné dans l’instantané dans le volet du haut.The Instances view displays the instances of the selected object in the snapshot in the upper pane. Le volet Chemins d’accès aux types racine et référence affiche les objets qui référencent l’instance sélectionnée et les types qu’elle référence.The Paths to Root and Referenced Types pane display the objects that reference the selected instance and the types that the selected instance references. 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.When the debugger is stopped at the point where the snapshot was taken, you can hover over the Value cell to display the values of the object in a tool tip.

Rapports sur les types natifsNative type reports

Cliquez sur le lien actif d’une cellule Allocations (Diff.) ou Taille du tas (Diff.) dans la table récapitulative Utilisation de la mémoire de la fenêtre Outils de diagnostic.Choose the current link of a Allocations (Diff) or Heap Size (Diff) cell in the Memory Usage summary table of the Diagnostic Tools window.

Affichage du type natifNative Type View

La vue Types affiche le nombre et la taille des types dans l’instantané.The Types View displays the number and size of the types in the snapshot.

  • Cliquez sur l’icône des instances (L’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é.Choose the instances icon (The instance icon in the Object Type column) of a selected type to display information about the objects of the selected type in the snapshot.

    La vue Instances affiche chaque instance du type sélectionné.The Instances view displays each instance of the selected type. 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 .Selecting an instance displays the call stack that resulted in the creation of the instance in the Allocation Call Stack pane.

    Vue InstancesInstances view

  • Choisissez Affichage des piles dans la liste Mode Affichage pour afficher la pile des allocations pour le type sélectionné.Choose Stacks View in the View Mode list to see the allocation stack for the selected type.

    Vue PilesStacks View

Rapports sur les modifications (Différences)Change (Diff) reports

  • Cliquez sur le lien Modification dans une cellule du tableau récapitulatif de l’onglet Utilisation de la mémoire dans la fenêtre Outils de diagnostic .Choose the change link in a cell of the summary table of the Memory Usage tab on the Diagnostic Tools window.

    Choisir un rapport de modification (diff)Choose a change (dif)f report

  • Choisissez un instantané dans la liste Comparer à d’un rapport sur la mémoire managée ou native.Choose a snapshot in the Compare To list of a managed or native report.

    Choisir un instantané dans la liste Comparer àChoose a snapshot from the Compare To list

    Le rapport des modifications ajoute des colonnes (marquées par la mention (Diff)) au rapport de base, qui affichent la différence entre la valeur de l’instantané de base et celle de l’instantané comparé.The change report adds columns (marked with (Diff)) to the base report that show the difference between the base snapshot value and the comparison snapshot. Voici à quoi peut ressembler un rapport des différences de la vue des types natifs :Here's how a Native Type View diff report might look:

    Affichage Diff des types natifsNative Types Diff Veiw

Blogs et vidéosBlogs and videos

Icône représentant une caméra pour les vidéosmovie camera icon for video Regardez une vidéo sur l’utilisation des outils de diagnostic qui montre comment analyser l’utilisation de la mémoire et l’utilisation de l’UC dans Visual Studio 2017.Watch a video on using the diagnostics tools that shows how to analyze memory usage and CPU usage in Visual Studio 2017.

Analyser l’UC et la mémoire pendant le débogageAnalyze CPU and Memory While Debugging

Blog Visual C++ : Profilage de la mémoire dans Visual C++ 2015Visual C++ Blog: Memory Profiling in Visual C++ 2015

Étapes suivantesNext steps

Dans ce didacticiel, vous avez appris comment collecter et analyser les données d’utilisation de la mémoire.In this tutorial, you've learned how to collect and analyze memory usage data. Si vous avez déjà fait la visite guidée du profileur, vous pouvez souhaiter avoir une vue d’ensemble rapide de la manière d’analyser l’utilisation de l’UC dans vos applications.If you already completed the tour of the profiler, you may want to get a quick look at how to analyze CPU usage in your apps.