Détecter et éviter les fuites de mémoire dans les applications .NET Fabrice MARGUERIE Architecte .NET metaSapiens Yann SCHWARTZ Architecte .NET Polom 1 min date
Au programme Les principes Détecter et corriger Prévenir plutôt que guérir Indiquer qu’on se base sur des retours d’expérience date
Au programme Les principes Détecter et corriger Prévenir plutôt que guérir
La mémoire en .NET La mémoire du processus La pile, le tas Le Garbage Collector Ce qui retient les instances Références statiques GCHandles Références des piles (une pile par thread) Finalization queue 3 min date
Fuites de mémoire Définition En informatique, une fuite de mémoire est un type particulier de consommation non intentionnelle de mémoire par un programme qui ne libère pas comme il le devrait la mémoire dont il n'a plus besoin. Les causes les plus classiques d'une telle situation sont : un oubli un bug une méconnaissance 4 min date
Fuites de mémoire Les langages qui présentent une gestion automatisée de la mémoire, tels Java, C#, VB.NET ou LISP, ne sont pas immunisés contre les fuites de mémoire. Le garbage collector récupère uniquement la mémoire qui n'est plus accessible. Il ne libère pas la mémoire tant qu'elle reste accessible. En .NET, cela signifie que des objets accessibles par au moins une référence ne seront par relâchés par le garbage collector. Rappeler la différence entre managé et non-managé : en C, C++ classique, Delphi classique, etc., on doit libérer soi-même la mémoire avec des appels à free, Free, delete, ou autre en .NET la libération est automatique. Rappeler que ça ne veut pas dire qu'on ne doit se soucier de rien. On est en managé, mais on peut maintenir facilement en vie bcp de mémoire. On référence aussi des ressources non-managées - connexions à des bases de données, objets graphiques, et autres objets systèmes. Transition vers la suite en disant qu'en .NET il y a des pièges (événements, etc.) qu'on va détailler dans le reste de la session. date
Fuites de mémoire Une goutte d'eau n'est pas un gros problème. Mais goutte par goutte, une fuite peut devenir un problème majeur. En informatique, même une petite fuite peut mettre le système à genoux si elle se produit plusieurs fois. date
Au programme Les principes Détecter et corriger Prévenir plutôt que guérir
Les étapes de la traque 1. Détecter la fuite 2. Trouver la ressource qui fuit 3. Décider où et quand la libérer la ressource dans le code 1 min date
Fabuleuse application PhotoLight Démo Fabuleuse application PhotoLight 8 min (PhotoLight + TaskManager + PerfMon) date
Photo…Light ?
Les outils pour agir Trois approches complémentaires Vue haut niveau, audit général : dotTrace Plus en détail : .NET Memory Profiler Pour les explorateurs : WinDbg 4 min La recherche de fuites mémoire n'est pas forcément chose compliquée. Il existe différents outils pour différents cas de figure et utilisateurs : - Pour une vue haut niveau, un audit général : dotTrace Pour creuser la question et analyser d'éventuels problème (mais nécessitant une connaissance plus poussée du modèle mémoire de la CLR) : .NET Memory Profiler Pour une approche exploratoire, et pour ceux habitués aux outils bas niveau : windbg date
VMMap date
dotTrace 9 min date
dotTrace date
dotTrace date
Problème identifié Evénement statique PhotoLight.exe MainForm DetailsForm OptionsForm SystemEvents.InstalledFontsChanged date
.NET Memory Profiler 8 min date
.NET Memory Profiler
Problème identifié Désabonnement manquant PhotoLight.exe MainForm OpacityChanged DetailsForm OptionsForm date
WinDbg Debugger natif/managed et « graphique » Installation minimale Permet de s’attacher à un processus ou d’explorer un dump mémoire Idéal pour se plonger dans les entrailles d’un processus 10 min date
Extensions WinDbg Sos.dll permet d’examiner la mémoire managed !DumpHeap liste des instances du tas !DumpObject !GCRoot trouve l’instance racine d’une instance
WinDbg Montrer fenêtre Modules en debug sous VS ? date
Problème identifié Code généré à la volée PhotoLight.exe MainForm Assemblage XmlSerializer Assemblage XmlSerializer Settings Manager DetailsForm OptionsForm date
Problèmes identifiés Dispose pas appelée Code généré à la volée PhotoLight.exe MainForm Assemblage XmlSerializer Assemblage XmlSerializer Settings Manager DetailsForm Context Menu SystemEvents.UserPreferenceChanged date
Au programme Les principes Détecter et corriger Prévenir plutôt que guérir
Causes courantes Références statiques 3 min date
Causes courantes Evénements statiques Evénements sans désabonnement
Causes courantes Dispose pas appelé Traitement réalisé dans Dispose incomplet
Il y a de quoi varier les plaisirs… Code compilé à la volée Spécifiques aux technologies (Silverlight, WPF, applications composites, etc.)
Prévenir plutôt que guérir Contrôler la possession des objets Analyse statique (NDepend, …) Mais avant tout une bonne connaissance de son code Chaque += (ou AddHandler) est un ennemi en puissance ! -= ! using et Dispose WeakEvents EventBroker Ou tout simplement relancer l’appli… 5 min date
Prévenir plutôt que guérir On n’est pas à l’abri d’un oubli Ecran de monitoring intégré
Outils Outils dédiés au profilage en .NET dotTrace, .NET Memory Profiler, ANTS Profiler, YourKit Profiler, PurifyPlus, Aqtime, CLR Profiler, … http://sharptoolbox.com/categories/profilers-debuggers WinDbg, SOS.dll, linqdbg http://www.microsoft.com/whdc/devtools/debugging/ http://code.google.com/p/linqdbg/ VMMap http://sysinternals.com Bear, GDI Usage http://thesz.diecru.eu/content/bear.php http://msdn.microsoft.com/en-us/magazine/cc301756.aspx 1 min date
Ressources Article Détecter et éviter les fuites de mémoire et de ressources dans les applications .NET En français sur DotNetGuru http://dotnetguru.org/modules.php?file=article&sid=1283 En anglais sur MSDN http://msdn.microsoft.com/en-us/library/ee658248.aspx Livre Advanced .NET Debugging Mario Hewardt, également auteur de Advanced Windows Debugging Livre Debugging Microsoft .NET 2.0 Applications John Robbins
Ressources Blog de Tess Ferrandez, ASP.NET Escalation Engineer chez Microsoft http://blogs.msdn.com/tess/archive/tags/Memory+issues/default.aspx Détection de fuites de handler d’événements avec WinDbg http://is.gd/79Qlk (blog de David Anson, MS) Autres liens à la fin de l’article
Contacts Architecture et expertise .NET fabrice@metasapiens.com http://weblogs.asp.net/fmarguerie yann@polom.com @abolibibelot http://blog.polom.com
Compléments
Bear et GDIUsage