Memory Leak

Signaler
Messages postés
6
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
27 juillet 2005
-
Messages postés
52
Date d'inscription
jeudi 28 octobre 2004
Statut
Membre
Dernière intervention
24 août 2005
-
Bonjour,

Je voulais savoir si quelqu'un connaissait un outil pour aider à la détection des fuites mémoires en C# ? Du style Purify pour le C++ il me semble.

merci
A voir également:

11 réponses

Messages postés
805
Date d'inscription
jeudi 22 mai 2003
Statut
Membre
Dernière intervention
30 octobre 2010

euh , des fuites mémoires??? je n'ai jamais entendu parler de ca, je pense que le c# est très sécurisé, pas comme le cblusblus, alors le compilateur ne laisse pas executer ces trucs

(Je pense)

YaoYao !!
1 + 1 = 10
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
38
Salut, il n'y a pas de memory leak avec le code managé justement ! A moins d'utiliser de la mémoire non managée, ce qui n'est pas fréquent dans des projets "classiques".

CLR Profiler ( sur le site de Microsoft ).
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
36
ca arrive de perdre de la mémoire...

par exemple, un exemple à la con, essayé d'utiliser des images (bitmap), si vous ne faites pas de Dispose à la fin... et bah la mémoire monte, monte, monte...


<HR>
Sébastien FERRAND

Blog : http://blogs.developpeur.org/sebmafate
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
38
Et le Dtor du bitmap il appele Dispose, j'espère !?
Messages postés
6
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
27 juillet 2005

J'utilise du code non managé justement. Pour traiter des images pixel par pixel c plus efficace quand même. Je pensais avoir correctement libéré ces ressources (normalement avec lock/unlock) mais je vais revérifier. Le problème que j'ai est que j'utilise des resosurces que je ne dois pas libèrer pas explicitement (je pense) avec dispose par exemple et qui trainent à la fin de mon exécution. Et ca GC ou pas le programme ne peut pas deviner quand est ce j'arrete de les utiliser. Bref, j'ai un résidu de 100 Mo après une exécution qui monte jusque 500 Mo...
Messages postés
305
Date d'inscription
vendredi 18 juillet 2003
Statut
Membre
Dernière intervention
2 août 2010
2
Une bonne habitude à prendre est de se forcer à faire un dispose sur
tous les objets possédant cette méthode...., j'ai moi aussi rencontré
des pertes de mémoires (pas seulement du à mon age) et pas sur des
bitmaps mais sur des usercontrol qui étaient créer dynamiquement sur
des panels et détruit par monPanel..Controls.Clear().

Théo
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
38
Vi, mais normalement le destructeur il appelle Dispose, et le GC à moins d'un sortie anormale ( plantage ) du programme il n'oublie pas la méthode Finalize.
Messages postés
52
Date d'inscription
jeudi 28 octobre 2004
Statut
Membre
Dernière intervention
24 août 2005
1
Il faut surtout se forcer a utiliser using (tonobjet) { } quand c'est
possible, tu es sur au moins que Dispose sera appelé meme si une
exception est déclanchée.

Miiitch
Messages postés
6
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
27 juillet 2005

Salut,

Je me suis un peu plus documenté sur les méthodes à utiliser pour libérer les ressources en C# mais quelques questions substistent. En fait je travaille avec des classes qui, pour la plupart, contiennent des ArrayList et Hashtable en données membres, est ce que je dois appeler la méthode clear sur ces données pour informer le GC qu'elles ne sont plus nécéssaires ? Est ce que je dois en plus affecter la valeur null à ces conteneurs ?
Certains de ces conteneurs stockent des strings, donc type de base, pour ces conteneurs j'appele juste la méthode clear, pour les autres conteneurs qui stockent des images je les parcoure en entier et j'appele explicitement dispose sur le éléments... est-ce que la bonne facon de faire ?
D'une manière générale, comment est ce qu'on differencie une ressource managée d'une non managée ?

merci.
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
38
Salut, Le GC il passe "de temps en temps" faire son boulot, ou alors quand ton application à besoin de mémoire, il libère la mémoire des objets qui non plus aucune références valides ( reference == null ) rien a voir avec Dispose, il ne libere pas un objet juste parce qu'une méthode Dispose a été appellée dessus, mais l'interêt de la méthode Dispose, c'est que le concepteur de la classe libère les ressources non managées dans cette méthode et mets aussi plusieurs champs privés à null, donc collectable par le GC, c'est pour ca qu'il ne faut plus utiliser une classe disposée. Et dans une bonne conception, le destructeur ( la méthode Finalize ) appelle aussi Dispose, ainsi on est sûr que les ressources non managées sont liberées.
Messages postés
52
Date d'inscription
jeudi 28 octobre 2004
Statut
Membre
Dernière intervention
24 août 2005
1
Des que tu n'utilises plus un objet dans ton code, le GC sait qu'il
peut se detruire. meme si la variable n'est pas a null, c'est meme pour
cela que ce n'est pas la peine de le faire!
Par contre certains
objets heritent de l'interface IDisposable, generalement ces objets
bloque des ressources systemes, qu'il faut mieux liberer des qu'on en a
plus besoin sans attendre le passage du GC grace soit à la méthode
Dispose ou la close using { } comme dit plus haut dans la discussion.
Miiitch