Commençons par le début :

Définition :

En informatique, une fuite de mémoire est un type particulier de consommation non intentionnelle de mémoire par un programme qui ne libère pas comme il le devrait la mémoire dont il n'a plus besoin.


Dans un système informatique, une petite fuite qui se répète de manière indéfinie peut avoir de gros impact sur les performances.

Les langages qui présentent une gestion automatisée de la mémoire, tels Java, C#, VB.NET ou LISP, ne sont pas immunisés contre les fuites de mémoire.
Le garbage collector récupère uniquement la mémoire qui n'est plus accessible. Il ne libère pas la mémoire tant qu'elle reste accessible. En .NET, cela signifie que des objets accessibles par au moins une référence ne seront par relâchés par le garbage collector.


Détection d'une fuite de mémoire :

Le symptôme le plus visible, c'est la mémoire allouée ("octets privés") au programme qui ne cesse d'augmenter et qui peut prendre une grande ampleur avant que le système coupe de lui-même le programme fautif.

Plusieurs outils pour différentes approches :

  • Le moniteur de performance Windows ou perfmon permet entre autre de visualiser de manière globale les octets privés associés à un processus en particulier.



  • Vue haut niveau, audit général : dotTrace, il permet le profilage complet de votre application à condition de le laisser lancer votre application.







  • Plus en détail : .NET Memory Profiler, très graphique et très complet.






  • Pour les explorateurs : WinDbg, tout en ligne de commande, il vous permet d'entrer dans le coeur de votre processus et d'analyser des dump mémoires.



Faire de la prévention :

Plusieurs causes à ces fuites de mémoires :
  • Références statiques



  • Evénements statiques




  • Evénements sans désabonnement



  • Dispose pas appelé


Les moyens pour prévenir ces fuites de mémoires :
  • Contrôler la possession des objets
    • Analyse statique (NDepend, …)
    • Mais avant tout une bonne connaissance de son code

  • Chaque += (ou AddHandler) est un ennemi en puissance !
    • -= !
    • using et Dispose
    • WeakEvents
    • EventBroker

  • Ou tout simplement relancer l’appli…


OUTILS :
Outils dédiés au profilage en .NET
dotTrace, .NET Memory Profiler, ANTS Profiler, YourKit Profiler, PurifyPlus, Aqtime, CLR Profiler, …
http://sharptoolbox.com/categories/profilers-debuggers

WinDbg, SOS.dll, linqdbg
http://www.microsoft.com/whdc/devtools/debugging/
http://code.google.com/p/linqdbg/

VMMap
http://sysinternals.com

Bear, GDI Usage
http://thesz.diecru.eu/content/bear.php
http://msdn.microsoft.com/en-us/magazine/cc301756.aspx

source: Présentation TechDays 2010
TechDays 2010 session slides and source code