1 / 51

XAML UI – Chasse aux Fuites Mémoire

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

piera
Download Presentation

XAML UI – Chasse aux Fuites Mémoire

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 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

  2. Agenda • Qui sommes-nous ? • Gestion de la mémoire en .NET • Les fuites mémoire • Outils de profiling • Démos! (et solutions )

  3. Luc Vo Van Consultant chez Microsoft Consulting Services .Net, XAML, UX, Azure blogs.msdn.com/luc Disclaimer

  4. 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

  5. Jonathan Antoine Dev UX passionné : consultant, formateur, … Wpf, SL, Wp7, WinRt, NUI jonathanAntoine.com @jmix90 MVVM: de la découverte à la maîtrise

  6. 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éé

  7. 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

  8. Gestion de la Mémoire en .NET • L’allocation mémoire est faite linéairement dans un tas (heap) Obj1 Obj2 Obj3

  9. Gestion de la Mémoire en .NET • L’allocation mémoire est faite linéairement dans un tas (heap) Obj1 Obj2 Obj3 Obj4

  10. Gestion de la Mémoire en .NET • Fonctionnement du garbagecollector (GC) • Déclenchement • Marquage • Libération • Compactage

  11. Gestion de la Mémoire en .NET • Marquage

  12. Gestion de la Mémoire en .NET • Marquage

  13. Gestion de la Mémoire en .NET • Libération

  14. Gestion de la Mémoire en .NET • Compactage

  15. Gestion de la Mémoire en .NET • 3 générations Gen1 Gen2 Gen3

  16. Gestion de la Mémoire en .NET • 3 générations, une large objectheap Gen1 Gen2 Gen3 LOH

  17. 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 »

  18. Gestion de la Mémoire en .NET LE livre de référence

  19. Les Fuites Mémoires • Les fuites mémoire en code managé, c’est possible ?!? • Oui !

  20. Les Fuites Mémoires • On attends la fin du projet ? • Non ! • Chaque scénario • Utilisation longue de l’appli

  21. Les Fuites Mémoires • The Usual Suspects • Désabonnements d’EventHandlers • Appel / implémentation d’IDisposable.Dispose • Collections rootées • Bugs dans les frameworks

  22. 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

  23. Les Fuites Mémoires • Comment y remédier ? Détecter Identifier Corriger

  24. Détecter • Outils de détection Process Explorer Process Monitor Task Manager bof!

  25. Process ExplorerProcess Monitor

  26. Identifier • Outils d’identification Ants Memory Profiler JetBrainsDotTrace ScitechMemProfiler SAD / LeakShell … et bien d’autres Microsoft CLR Profiler (link)

  27. Outils de Profiling Mémoire • Principes d’utilisation

  28. Premier décorticage !

  29. 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

  30. Corriger • Outils de correction Visual Studio 

  31. Les fuites étudiées ! • EventHandler “oubliés” • IDisposable • Membre statique rooté • Objets non-INotifyPropertyChanged • DP ChangedCallbacks • Interop Windows Forms (WPF)

  32. 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

  33. Fuite d’EventHandler / lambda

  34. Fuite d’EventHandler • Pourquoi ? abonnés Obj1 Callback() source Event Obj2 Callback() Obj3 Callback()

  35. IDisposable • Implémenter et appelerIDisposable sur les objets référençant… • des ressources non managées • des objets « transverses »

  36. IDisposable = IMustBeDisposed

  37. Membre statique rooté • Les membres statiques ne sont JAMAIS libérés par un garbagecollect

  38. Membre statique rooté

  39. AddValueChanged (WPF) • Sur la classe DependencyPropertyDescriptor : • AddValueChanged créé une référence forte • Utiliser RemoveValueChangedpour la supprimer

  40. AddValueChanged (DPCC)

  41. 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

  42. 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

  43. 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

  44. Propriétés non-INotifyPropertyChanged

  45. 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

  46. [BONUS] Interop Windows Forms

  47. À 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 !

  48. Q&A

  49. Bonne chasse !

More Related