Salut à tous,
Je viens de passer quelques lonnngggues heures sur un problème de memory leak, et semble l'avoir "résolu", d'une manière logique mais surprenante...J'aimerais avoir votre point de vue sur ce problème.
Contexte :
- framework .Net 1.1
- une appli qui charge une centaine de composants maisons "B" dans un panel "A".
- les fonctionnalités de l'appli amènent à vider ce panel A pour le remplir avec d'autres composants B pour rafraichir les datas.
- pour vider mon panel A je faisais un simple A.controls.clear
==> Constat #1 : après ce clear, aucune baisse de la mémoire consommée.
- j'ai donc procédé autrement : while A.controls.count>0 : A.controls(0).dispose
==> Constat #2 : pas mieux
... je vous passe les autres tentatives de GC.Collect, etc...
A coup de débug, j'ai fini par comprendre que certains objets (Tooltip et Timer) de B n'étaient pas libérés par les B.Dispose.
J'ai donc résolu mon problème en :
1> déclarant Private à la classe B tous ces objets Timer et ToolTip
2> overloadant le Dispose de B afin et d'y libérer à la mano les objets Timer et ToolTip ci-dessus...
3> faisant donc un while A.controls.count>0 : A.controls(0).dispose
Et là ça marche ! Plus aucune fuite
Mais je suis surpris que :
- le A.controls.clear ne libère pas naturellement de la mémoire les controls B supprimés (les B.Dispose ne sont pas appelés)
- le B.dispose ne libère pas naturellement les objets Timer et Tooltip créés par B
Votre avis ? Y' a t'il qqle chose que m'échappe dans ce framework...?
Partager