Gestion de la Mémoire en .NET

Download Report

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