xaml ui – chasse aux fuites mémoire
DESCRIPTION
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 - PowerPoint PPT PresentationTRANSCRIPT
palais des congrès Paris
7, 8 et 9 février 2012
Jonathan AntoineDév. .NET passionnéInfinite Square
XAML UI – Chasse aux Fuites Mémoire
Luc Vo VanConsultant Dev/UXMicrosoft
7 Février 2012 Aussi unpassionné!
Qui sommes-nous ?Gestion de la mémoire en .NETLes fuites mémoireOutils de profilingDémos! (et solutions )
Agenda
Luc Vo Van
blogs.msdn.com/luc
Disclaimer
.Net, XAML, UX, Azure
Consultant chez Microsoft Consulting Services
Une expertise tout au long du cycle de vie informatique
Evaluation
Planification
Développement
Déploiement
Stabilisation
Opérations
Support
Alignement business & IT Optimisation et Opération
Support Premier
Entreprise StrategyMicrosoft Consulting Services
Déploiement et adoption
Microsoft Services
Partenaires
Jonathan Antoine
jonathanAntoine.com@jmix90
MVVM: de la découverte à la maîtrise
Wpf, SL, Wp7, WinRt, NUI
Dev UX passionné : consultant, formateur, …
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…
GOLD Certified Partnersur 4 domaines de compétences
Agréé CIR
Centre de formationagréé
INFINITE SQUARE en quelques mots…
L’allocation mémoire est faite linéairement dans un tas (heap)
Gestion de la Mémoire en .NET
Obj1 Obj2
Mémoire demandée à l’OS
Occupation ‘effective’
L’allocation mémoire est faite linéairement dans un tas (heap)
Gestion de la Mémoire en .NET
Obj1 Obj2 Obj3
L’allocation mémoire est faite linéairement dans un tas (heap)
Gestion de la Mémoire en .NET
Obj1 Obj2 Obj3 Obj4
Fonctionnement du garbage collector (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
Gestion de la Mémoire en .NETGen1
Gen2
Gen3
3 générations, une large object heap
Gestion de la Mémoire en .NETGen1
Gen2
Gen3
LOH
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
Gestion de la Mémoire en .NET
LE livre de référence
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 ?
Les Fuites Mémoires
Détecter Identifier Corriger
Outils de détection
Détecter
Process ExplorerProcess Monitor
Task Manager bof!
DEMO
Process ExplorerProcess Monitor
Outils d’identification
Identifier
Ants Memory ProfilerJetBrains DotTraceScitech MemProfilerSAD / LeakShell
… et bien d’autres
Microsoft CLR Profiler (link)
Naviguer vers le
scénario
Prendre un snapshot
Exécuter l’action
soupçonnée
Prendre un snapshot
Comparer
Outils de Profiling MémoirePrincipes d’utilisation
DEMO
Premier décorticage !
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
Outils de Profiling Mémoire
Outils de correction
Corriger
Visual Studio
EventHandler “oubliés”IDisposableMembre statique rootéObjets non-INotifyPropertyChangedDP ChangedCallbacksInterop Windows Forms (WPF)
Les fuites étudiées !
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
DEMO
Fuite d’EventHandler / lambda
Pourquoi ?
Fuite d’EventHandler
Event
sourceO
bj1Callback()O
bj2Callback()
Obj3Callback()
abonnés
Implémenter et appeler IDisposable sur les objets référençant…
des ressources non managées
des objets « transverses »
IDisposable
DEMO
IDisposable = IMustBeDisposed
Les membres statiques ne sont JAMAIS libérés par un garbage collect
Membre statique rooté
DEMO
Membre statique rooté
Sur la classe DependencyPropertyDescriptor :
AddValueChanged créé une référence forte
Utiliser RemoveValueChanged pour la supprimer
AddValueChanged (WPF)
DEMO
AddValueChanged (DPCC)
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
Propriétés non-INotifyPropertyChanged
DEMO
Propriétés non-INotifyPropertyChanged
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
Utilisation d’un Label Windows Forms (WPF)
DEMO
[BONUS] Interop Windows Forms
Les fuites mémoires, c’est possible en .NETSurveillez 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 !
À Retenir
Q&A
Bonne chasse !
Chaque semaine, les DevCampsALM, Azure, Windows Phone, HTML5, OpenDatahttp://msdn.microsoft.com/fr-fr/devcamp
Téléchargement, ressources et toolkits : RdV sur MSDNhttp://msdn.microsoft.com/fr-fr/
Les offres à connaître90 jours d’essai gratuit de Windows Azure www.windowsazure.fr
Jusqu’à 35% de réduction sur Visual Studio Pro, avec l’abonnement MSDN www.visualstudio.fr
Pour aller plus loin10
février 2012
Live Meeting
Open Data - Développer des applications riches avec le protocole Open Data
16 février 2012
Live Meeting
Azure series - Développer des applications sociales sur la plateforme Windows Azure
17 février 2012
Live Meeting Comprendre le canvas avec Galactic et la librairie three.js
21 février 2012
Live Meeting La production automatisée de code avec CodeFluent Entities
2 mars 2012
Live Meeting
Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7, iOS et Android
6 mars 2012
Live Meeting Nuget et ALM
9 mars 2012
Live Meeting Kinect - Bien gérer la vie de son capteur
13 mars 2012
Live Meeting Sharepoint series - Automatisation des tests
14 mars 2012
Live Meeting
TFS Health Check - vérifier la bonne santé de votre plateforme de développement
15 mars 2012
Live Meeting
Azure series - Développer pour les téléphones, les tablettes et le cloud avec Visual Studio 2010
16 mars 2012
Live Meeting
Applications METRO design - Désossage en règle d'un template METRO javascript
20 mars 2012
Live Meeting
Retour d'expérience LightSwitch, Optimisation de l'accès aux données, Intégration Silverlight
23 mars 2012
Live Meeting
OAuth - la clé de l'utilisation des réseaux sociaux dans votre application
Prochaines sessions des Dev Camps