XAML UI – Chasse aux Fuites Mémoire

Post on 23-Feb-2016

70 views 0 download

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 Presentation

Transcript of XAML UI – Chasse aux Fuites Mémoire

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