Gestion de la Mémoire en .NET

Report
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
Luc Vo Van
Dév. .NET passionné
Infinite Square
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
Support Premier
Evaluation
Développement
Planification
Alignement business & IT
Stabilisation
Déploiement
Déploiement et adoption
Partenaires
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 ?
abonnés
Callback()
Obj1
Callback()
Obj2
Callback()
Obj3
source
Event
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 seuls !
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
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

similar documents