Probleme de Mémoire

cs_Tolliap Messages postés 60 Date d'inscription lundi 4 décembre 2006 Statut Membre Dernière intervention 11 janvier 2013 - 27 janv. 2009 à 10:06
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 - 31 janv. 2009 à 18:42
Bonjour,

J'ai un problème de taille dans tous les sens du terme...

J'ai créé un programme de gestion pour une entreprise, lors le l'ouverture de celui ci il pèse en mémoire 30 Mo
Après plusieurs ouverture de divers formulaire mon application ne cesse de grossir en mémoire, jusqu'à arrivé a saturation (environ 250mo).
J'aimerai savoir si vous connaissais un méthode pour vider le mémoire... apparemment, mes formulaire ne libéré pas la mémoire après sa destruction.
(je fait un dispose suivi d'un form = null)

Aprés quelques recherche j'avais trouver cette methode que je lance au démarage et que je fait tourner en boucle :


<hr size="2" width="100%" />

  while (!event_.WaitOne(PERIOD_IN_MS, false))
            {
                GC.Collect();
                GC.WaitForPendingFinalizers();
            }
<hr size="2" width="100%" />
Mais sans succées.
Esque je doit mettre tous mes composant a null pour le  garbage collection se fasse bien?

merci de vos réponse

Alex

Qui ne tente rien, n'a rien

6 réponses

kerma26 Messages postés 36 Date d'inscription vendredi 11 mai 2007 Statut Membre Dernière intervention 20 août 2009
27 janv. 2009 à 21:13
Salut,

Alors tout d'abord, quand tu ouvres tes formulaires, as-tu pensé à les fermer ?
Parce que il ne suffit pas de cliquer sur la croix rouge, il faut aussi que tu fasse un maFenetre.close(), enfin je ne sais plus la syntaxe exacte.
Donc déjà vérifie que tu ferme bien comme il faut chaque formulaire.
Puis deuxièmement as-tu debugger ton programme pas à pas pour voir si tu n'a pas une boucle infinie (while/for).

Voila désolé je ne peu pas t'aider plus que ça, donc j'espère que ça résoudra ton problème.

bye.
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
27 janv. 2009 à 21:36
Bonsoir,
De base, le framework .NET occupe environ 20Mo en mémoire.
Concernant la méthode Collect de GC, elle ne doit pas être utilisée par "des amateurs": le framework .NET se charge de tout, faut pas toucher à ça SAUF si on sait exactement ce qu'on fait, et à mon avis celui qui a pondu la méthode que tu proposes ci-dessus le ne sait pas...

Concernant ton problème, il faut voir si y'a pas des objets qui ne sont pas disposés, des boucles infinies, etc. Sans code on va pouvoir aider et comme tu ne peux pas poster la solution au complet (...)

<hr />
-Blog-
-Site Perso-
0
cs_Tolliap Messages postés 60 Date d'inscription lundi 4 décembre 2006 Statut Membre Dernière intervention 11 janvier 2013
28 janv. 2009 à 00:10
Tu as raison, je ne peut pas poster la solution complète vous comprendrai pourquoi...

En ce qui concerne les boucle je ne pense pas que c'est le probleme...

Par contre j'ai lu sur le forum que les dataset ne ce détruise pas completement, (http://www.csharpfr.com/forum/sujet-MEMOIRE-AUGMENTE_1234436.aspx)

et vu que je créer souvent des dataset, je pense que je vais faire des recherche de ce coté.

Merci pour vos réponses.

Alexandre


Qui ne tente rien, n'a rien
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
31 janv. 2009 à 16:44
Salut,

Le type DataSet maintient peut être (je dis bien peut être, je ne me suis jamais penché sur ce type en détail) des données statiques, mais de la à saturer j'en doute.
Après il faut voir ce que tu fais avec les données du DataSet, et notamment si tu ne maintient pas des références aux DataTable etc

/*
coq
MVP Visual C#
CoqBlog
*/
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Tolliap Messages postés 60 Date d'inscription lundi 4 décembre 2006 Statut Membre Dernière intervention 11 janvier 2013
31 janv. 2009 à 18:29
si tu ne maintient pas des références aux DataTable etc

Sa veut dire quoi?


Qui ne tente rien, n'a rien
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
31 janv. 2009 à 18:42
Exemple (idiot mais c'est juste pour illustrer clairement) :

class MaClasse
{
  private DataTable maTable;

  public MaClasse(DataSet ds)
  {
    maTable = ds["Toto"];
  }

...
}

...
MaClasse maClasse;
private MaMethode()
{
   DataSet mesDonnees = ...;
   maClasse = new MaClasse(mesDonnees);
   mesDonnees.Dispose();
   // Arrivé ici, une référence est maintenue (dans l'instance de MaClasse) sur une des instance de DataTable qui faisaient partie du DataSet, l'appel à Dispose sur le DataSet ne détruit pas les instances de DataTable (elles deviennent élligibles à la finalisation si elle ne sont plus référencées ailleurs)
}

Enfin, ce n'est qu'un exemple de problème éventuel.

/*
coq
MVP Visual C#
CoqBlog
*/
0
Rejoignez-nous