Télécharger la présentation
Publié parCatharine Demange Modifié depuis plus de 9 années
1
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
2
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
3
Au programme Les principes Détecter et corriger
Prévenir plutôt que guérir
4
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
5
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
6
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
7
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
8
Au programme Les principes Détecter et corriger
Prévenir plutôt que guérir
9
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
10
Fabuleuse application PhotoLight
Démo Fabuleuse application PhotoLight 8 min (PhotoLight + TaskManager + PerfMon) date
11
Photo…Light ?
12
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
13
VMMap date
14
dotTrace 9 min date
15
dotTrace date
16
dotTrace date
17
Problème identifié Evénement statique PhotoLight.exe MainForm
DetailsForm OptionsForm SystemEvents.InstalledFontsChanged date
18
.NET Memory Profiler 8 min date
19
.NET Memory Profiler
20
Problème identifié Désabonnement manquant PhotoLight.exe MainForm
OpacityChanged DetailsForm OptionsForm date
21
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
22
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
23
WinDbg Montrer fenêtre Modules en debug sous VS ? date
24
Problème identifié Code généré à la volée PhotoLight.exe MainForm
Assemblage XmlSerializer Assemblage XmlSerializer Settings Manager DetailsForm OptionsForm date
25
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
26
Au programme Les principes Détecter et corriger
Prévenir plutôt que guérir
27
Causes courantes Références statiques 3 min date
28
Causes courantes Evénements statiques Evénements sans désabonnement
29
Causes courantes Dispose pas appelé
Traitement réalisé dans Dispose incomplet
30
Il y a de quoi varier les plaisirs…
Code compilé à la volée Spécifiques aux technologies (Silverlight, WPF, applications composites, etc.)
31
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
32
Prévenir plutôt que guérir
On n’est pas à l’abri d’un oubli Ecran de monitoring intégré
33
Outils Outils dédiés au profilage en .NET dotTrace, .NET Memory Profiler, ANTS Profiler, YourKit Profiler, PurifyPlus, Aqtime, CLR Profiler, … WinDbg, SOS.dll, linqdbg VMMap Bear, GDI Usage 1 min date
34
Ressources Article Détecter et éviter les fuites de mémoire et de ressources dans les applications .NET En français sur DotNetGuru En anglais sur MSDN Livre Advanced .NET Debugging Mario Hewardt, également auteur de Advanced Windows Debugging Livre Debugging Microsoft .NET 2.0 Applications John Robbins
35
Ressources Blog de Tess Ferrandez, ASP.NET Escalation Engineer chez Microsoft Détection de fuites de handler d’événements avec WinDbg (blog de David Anson, MS) Autres liens à la fin de l’article
36
Contacts Architecture et expertise .NET
@abolibibelot
37
Compléments
38
Bear et GDIUsage
Présentations similaires
© 2024 SlidePlayer.fr Inc.
All rights reserved.