Transcript Gestion de la Mémoire en .NET
palais des congrès Paris 7, 8 et 9 février 2012
XAML UI – Chasse aux Fuites Mémoire
7 Février 2012 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 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 Evaluation Planification
Alignement business & IT
Développement Stabilisation Déploiement
Déploiement et adoption
Partenaires Support Premier Support Opérations
Optimisation et Opération
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 Microsoft de développement d’applications et de la plateforme applicative 25+ collaborateurs spécialisés sur les techno MS, dont 10 MVP… GOLD Certified Partner sur 4 domaines de compétences Agréé CIR Centre de formation agréé
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 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
Gen1 Gen2 Gen3
Gestion de la Mémoire en .NET
3 générations, une large object heap
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!
DEMO Process Explorer Process Monitor
Identifier
Outils d’identification Ants Memory Profiler JetBrains DotTrace Scitech MemProfiler SAD / LeakShell … et bien d’autres Microsoft CLR Profiler ( link )
Outils de Profiling Mémoire
Principes d’utilisation Naviguer vers le scénario Comparer Prendre un
snapshot
Prendre un
snapshot
Exécuter l’action soupçonnée
DEMO Premier décorticage !
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
DEMO Fuite d’EventHandler / lambda
Fuite d’EventHandler
Pourquoi ?
source
Event
abonnés
Callback() Callback() Callback()
IDisposable
Implémenter et appeler IDisposable sur les objets référençant… des ressources non managées des objets « transverses »
DEMO IDisposable = IMustBeDisposed
Membre statique
rooté
Les membres statiques ne sont JAMAIS libérés par un garbage collect
DEMO Membre statique
rooté
AddValueChanged (WPF) Sur la classe DependencyPropertyDescriptor : AddValueChanged créé une référence forte Utiliser RemoveValueChanged pour la supprimer
DEMO AddValueChanged (DPCC)
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 framework http://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 framework http://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
DEMO Propriétés non-INotifyPropertyChanged
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
DEMO [BONUS] Interop Windows Forms
À 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 seul
s
!
Détecter, Identifier, Corriger !
Détecter, Identifier, Corriger !
Détecter, Identifier, Corriger !
Q&A
Bonne chasse !
Pour aller plus loin
Chaque semaine, les DevCamps ALM, Azure, Windows Phone, HTML5, OpenData http://msdn.microsoft.com/fr-fr/devcamp Téléchargement, ressources et toolkits : RdV sur MSDN http://msdn.microsoft.com/fr-fr/ Les offres à connaître
90 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
Prochaines sessions des Dev Camps 10 février 2012 Live Meeting Open Data - Développer des applications riches avec le protocole Open Data 16 février 2012 17 février 2012 21 février 2012 Live Meeting Live Meeting Live Meeting Azure series - Développer des applications sociales sur la plateforme Windows Azure Comprendre le canvas avec Galactic et la librairie three.js
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 15 mars 2012 16 mars 2012 20 mars 2012 23 mars 2012 Live Meeting Live Meeting Live Meeting Live Meeting Live Meeting TFS Health Check - vérifier la bonne santé de votre plateforme de développement Azure series - Développer pour les téléphones, les tablettes et le cloud avec Visual Studio 2010 Applications METRO design - Désossage en règle d'un template METRO javascript Retour d'expérience LightSwitch, Optimisation de l'accès aux données, Intégration Silverlight OAuth - la clé de l'utilisation des réseaux sociaux dans votre application