51
palais des congrès Paris 7, 8 et 9 février 2012

XAML UI – Chasse aux Fuites Mémoire

  • Upload
    piera

  • View
    70

  • Download
    0

Embed Size (px)

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

Citation preview

Page 1: XAML UI – Chasse aux Fuites Mémoire

palais des congrès Paris

7, 8 et 9 février 2012

Page 2: XAML UI – Chasse aux Fuites Mémoire

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é!

Page 3: XAML UI – Chasse aux Fuites Mémoire

Qui sommes-nous ?Gestion de la mémoire en .NETLes fuites mémoireOutils de profilingDémos! (et solutions )

Agenda

Page 4: XAML UI – Chasse aux Fuites Mémoire

Luc Vo Van

blogs.msdn.com/luc

Disclaimer

.Net, XAML, UX, Azure

Consultant chez Microsoft Consulting Services

Page 5: XAML UI – Chasse aux Fuites Mémoire

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

Page 6: XAML UI – Chasse aux Fuites Mémoire

Jonathan Antoine

jonathanAntoine.com@jmix90

MVVM: de la découverte à la maîtrise

Wpf, SL, Wp7, WinRt, NUI

Dev UX passionné : consultant, formateur, …

Page 7: XAML UI – Chasse aux Fuites Mémoire

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…

Page 8: XAML UI – Chasse aux Fuites Mémoire

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’

Page 9: XAML UI – Chasse aux Fuites Mémoire

L’allocation mémoire est faite linéairement dans un tas (heap)

Gestion de la Mémoire en .NET

Obj1 Obj2 Obj3

Page 10: XAML UI – Chasse aux Fuites Mémoire

L’allocation mémoire est faite linéairement dans un tas (heap)

Gestion de la Mémoire en .NET

Obj1 Obj2 Obj3 Obj4

Page 11: XAML UI – Chasse aux Fuites Mémoire

Fonctionnement du garbage collector (GC)

Déclenchement Marquage Libération Compactage

Gestion de la Mémoire en .NET

Page 12: XAML UI – Chasse aux Fuites Mémoire

Marquage

Gestion de la Mémoire en .NET

Page 13: XAML UI – Chasse aux Fuites Mémoire

Marquage

Gestion de la Mémoire en .NET

Page 14: XAML UI – Chasse aux Fuites Mémoire

Libération

Gestion de la Mémoire en .NET

Page 15: XAML UI – Chasse aux Fuites Mémoire

Compactage

Gestion de la Mémoire en .NET

Page 16: XAML UI – Chasse aux Fuites Mémoire

3 générations

Gestion de la Mémoire en .NETGen1

Gen2

Gen3

Page 17: XAML UI – Chasse aux Fuites Mémoire

3 générations, une large object heap

Gestion de la Mémoire en .NETGen1

Gen2

Gen3

LOH

Page 18: XAML UI – Chasse aux Fuites Mémoire

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

Page 19: XAML UI – Chasse aux Fuites Mémoire

Gestion de la Mémoire en .NET

LE livre de référence

Page 20: XAML UI – Chasse aux Fuites Mémoire

Les fuites mémoire en code managé, c’est possible ?!?

Oui !

Les Fuites Mémoires

Page 21: XAML UI – Chasse aux Fuites Mémoire

On attends la fin du projet ?

Non ! Chaque scénario Utilisation longue de l’appli

Les Fuites Mémoires

Page 22: XAML UI – Chasse aux Fuites Mémoire

The Usual Suspects

Désabonnements d’EventHandlers Appel / implémentation d’IDisposable.Dispose Collections rootées Bugs dans les frameworks

Les Fuites Mémoires

Page 23: XAML UI – Chasse aux Fuites Mémoire

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

Page 24: XAML UI – Chasse aux Fuites Mémoire

Comment y remédier ?

Les Fuites Mémoires

Détecter Identifier Corriger

Page 25: XAML UI – Chasse aux Fuites Mémoire

Outils de détection

Détecter

Process ExplorerProcess Monitor

Task Manager bof!

Page 26: XAML UI – Chasse aux Fuites Mémoire

DEMO

Process ExplorerProcess Monitor

Page 27: XAML UI – Chasse aux Fuites Mémoire

Outils d’identification

Identifier

Ants Memory ProfilerJetBrains DotTraceScitech MemProfilerSAD / LeakShell

… et bien d’autres

Microsoft CLR Profiler (link)

Page 28: XAML UI – Chasse aux Fuites Mémoire

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

Page 29: XAML UI – Chasse aux Fuites Mémoire

DEMO

Premier décorticage !

Page 30: XAML UI – Chasse aux Fuites 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

Outils de Profiling Mémoire

Page 31: XAML UI – Chasse aux Fuites Mémoire

Outils de correction

Corriger

Visual Studio

Page 32: XAML UI – Chasse aux Fuites Mémoire

EventHandler “oubliés”IDisposableMembre statique rootéObjets non-INotifyPropertyChangedDP ChangedCallbacksInterop Windows Forms (WPF)

Les fuites étudiées !

Page 33: XAML UI – Chasse aux Fuites Mémoire

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

Page 34: XAML UI – Chasse aux Fuites Mémoire

DEMO

Fuite d’EventHandler / lambda

Page 35: XAML UI – Chasse aux Fuites Mémoire

Pourquoi ?

Fuite d’EventHandler

Event

sourceO

bj1Callback()O

bj2Callback()

Obj3Callback()

abonnés

Page 36: XAML UI – Chasse aux Fuites Mémoire

Implémenter et appeler IDisposable sur les objets référençant…

des ressources non managées

des objets « transverses »

IDisposable

Page 37: XAML UI – Chasse aux Fuites Mémoire

DEMO

IDisposable = IMustBeDisposed

Page 38: XAML UI – Chasse aux Fuites Mémoire

Les membres statiques ne sont JAMAIS libérés par un garbage collect

Membre statique rooté

Page 39: XAML UI – Chasse aux Fuites Mémoire

DEMO

Membre statique rooté

Page 40: XAML UI – Chasse aux Fuites Mémoire

Sur la classe DependencyPropertyDescriptor :

AddValueChanged créé une référence forte

Utiliser RemoveValueChanged pour la supprimer

AddValueChanged (WPF)

Page 41: XAML UI – Chasse aux Fuites Mémoire

DEMO

AddValueChanged (DPCC)

Page 42: XAML UI – Chasse aux Fuites Mémoire

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

Page 43: XAML UI – Chasse aux Fuites Mémoire

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

Page 44: XAML UI – Chasse aux Fuites Mémoire

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

Page 45: XAML UI – Chasse aux Fuites Mémoire

DEMO

Propriétés non-INotifyPropertyChanged

Page 46: XAML UI – Chasse aux Fuites Mémoire

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)

Page 47: XAML UI – Chasse aux Fuites Mémoire

DEMO

[BONUS] Interop Windows Forms

Page 48: XAML UI – Chasse aux Fuites Mémoire

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

Page 49: XAML UI – Chasse aux Fuites Mémoire

Q&A

Page 50: XAML UI – Chasse aux Fuites Mémoire

Bonne chasse !

Page 51: XAML UI – Chasse aux Fuites Mémoire

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