510 likes | 629 Views
XAML UI – Chasse aux Fuites Mémoire. 7 Février 2012. Aussi un passionné!. Jonathan Antoine Dév . .NET passionné Infinite Square. Luc Vo Van Consultant Dev /UX Microsoft. Agenda. Qui sommes-nous ? Gestion de la mémoire en .NET Les fuites mémoire Outils de profiling
E N D
XAML UI – Chasse aux Fuites Mémoire 7 Février 2012 Aussiunpassionné! Jonathan AntoineDév. .NET passionnéInfinite Square Luc Vo Van Consultant Dev/UXMicrosoft
Agenda • Qui sommes-nous ? • Gestion de la mémoire en .NET • Les fuites mémoire • Outils de profiling • Démos! (et solutions )
Luc Vo Van Consultant chez Microsoft Consulting Services .Net, XAML, UX, Azure blogs.msdn.com/luc Disclaimer
Microsoft Services Une expertise tout au long du cycle de vie informatique Entreprise Strategy Microsoft Consulting Services Support Premier Evaluation Développement Stabilisation Support Planification Opérations Déploiement Alignement business & IT Déploiement et adoption Optimisation et Opération Partenaires
Jonathan Antoine Dev UX passionné : consultant, formateur, … Wpf, SL, Wp7, WinRt, NUI jonathanAntoine.com @jmix90 MVVM: de la découverte à la maîtrise
INFINITE SQUARE en quelques mots… • Société de conseil, expertise, réalisation, et formation,exclusivement sur les technologies Microsoftde développement d’applications et de la plateforme applicative • 25+ collaborateurs spécialisés sur les techno MS,dont 10 MVP… • GOLDCertified Partnersur 4 domaines de compétences • Agréé CIR • Centre de formationagréé
Gestion de la Mémoire en .NET • L’allocation mémoire est faite linéairement dans un tas (heap) Occupation ‘effective’ Obj1 Obj2 Mémoire demandée à l’OS
Gestion de la Mémoire en .NET • L’allocation mémoire est faite linéairement dans un tas (heap) Obj1 Obj2 Obj3
Gestion de la Mémoire en .NET • L’allocation mémoire est faite linéairement dans un tas (heap) Obj1 Obj2 Obj3 Obj4
Gestion de la Mémoire en .NET • Fonctionnement du garbagecollector (GC) • Déclenchement • Marquage • Libération • Compactage
Gestion de la Mémoire en .NET • Marquage
Gestion de la Mémoire en .NET • Marquage
Gestion de la Mémoire en .NET • Libération
Gestion de la Mémoire en .NET • Compactage
Gestion de la Mémoire en .NET • 3 générations Gen1 Gen2 Gen3
Gestion de la Mémoire en .NET • 3 générations, une large objectheap Gen1 Gen2 Gen3 LOH
Gestion de la Mémoire en .NET • Fragmentation de la LOH • L’allocation des « gros » objets est effectuée dans une heap particulière : non générationnelle et non compactée • Elle s’effectue de la même manière qu’une allocation native : « allocation au premier espace contigu libre et suffisant »
Gestion de la Mémoire en .NET LE livre de référence
Les Fuites Mémoires • Les fuites mémoire en code managé, c’est possible ?!? • Oui !
Les Fuites Mémoires • On attends la fin du projet ? • Non ! • Chaque scénario • Utilisation longue de l’appli
Les Fuites Mémoires • The Usual Suspects • Désabonnements d’EventHandlers • Appel / implémentation d’IDisposable.Dispose • Collections rootées • Bugs dans les frameworks
Les Fuites Mémoires • Il n’y a pas que des fuites mémoire liées aux objets .NET ! • Fuite de connexion • Fuite de threads • Fuite de ressources natives Windows • Portez une attention particulière aux ressources bas niveau et/ou interop
Les Fuites Mémoires • Comment y remédier ? Détecter Identifier Corriger
Détecter • Outils de détection Process Explorer Process Monitor Task Manager bof!
Identifier • Outils d’identification Ants Memory Profiler JetBrainsDotTrace ScitechMemProfiler SAD / LeakShell … et bien d’autres Microsoft CLR Profiler (link)
Outils de Profiling Mémoire • Principes d’utilisation
Outils de Profiling Mémoire • Que rechercher dans les comparatifs de snapshots • Le différence de consommation mémoire • Les nouveaux objets • La variation du nombre d’instance des types soupçonnés
Corriger • Outils de correction Visual Studio
Les fuites étudiées ! • EventHandler “oubliés” • IDisposable • Membre statique rooté • Objets non-INotifyPropertyChanged • DP ChangedCallbacks • Interop Windows Forms (WPF)
Fuite d’EventHandler • Ne pas désabonner ses EventHandlers peut causer des fuites • Cas classiques dans les UI XAML • Chargements, déchargements dynamiques de contrôles, typiquement dans les systèmes de navigation page/onglets • Notifications de changements dans les collections
Fuite d’EventHandler • Pourquoi ? abonnés Obj1 Callback() source Event Obj2 Callback() Obj3 Callback()
IDisposable • Implémenter et appelerIDisposable sur les objets référençant… • des ressources non managées • des objets « transverses »
Membre statique rooté • Les membres statiques ne sont JAMAIS libérés par un garbagecollect
AddValueChanged (WPF) • Sur la classe DependencyPropertyDescriptor : • AddValueChanged créé une référence forte • Utiliser RemoveValueChangedpour la supprimer
Propriétés non-INotifyPropertyChanged • Certains Bindings peuvent causer des fuites • La cible du binding contient une référence vers la source • Bug répertorié du frameworkhttp://support.microsoft.com/kb/938416/en-us
Propriétés non-INotifyPropertyChanged • Certains bindings peuvent causer des fuites • La cible du binding contient une référence vers la source • La propriété source n’est ni une DP, ni notifiante • Bug répertorié du frameworkhttp://support.microsoft.com/kb/938416/en-us
Propriétés non-INotifyPropertyChanged • Pour un binding non-OneTime, WPF recherche le meilleur mécanisme de notification • DependencyObject • INotifyPropertyChanged • Pour les DependencyObjects, AddValueChanged via un PropertyDescriptor • Sinon pas de notification
Utilisation d’un Label Windows Forms (WPF) • Ce n’est pas une fuite • Les composants texte de WPF n’ont pas été conçus pour contenir de (très) grandes quantité de texte • Les composants natifs, tels que ceux wrappés dans Windows Forms, permettent d’intégrer de manière optimale ces types de scénarios
À Retenir • Les fuites mémoires, c’est possible en .NET • Surveillez tout au long du développement ! • De nombreux outils disponibles : vous n’êtes pas seuls ! • Détecter, Identifier, Corriger ! • Détecter, Identifier, Corriger ! • Détecter, Identifier, Corriger !