Probleme de Mémoire

Signaler
Messages postés
60
Date d'inscription
lundi 4 décembre 2006
Statut
Membre
Dernière intervention
11 janvier 2013
-
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
-
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

Messages postés
36
Date d'inscription
vendredi 11 mai 2007
Statut
Membre
Dernière intervention
20 août 2009

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.
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
54
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-
Messages postés
60
Date d'inscription
lundi 4 décembre 2006
Statut
Membre
Dernière intervention
11 janvier 2013

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
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
87
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
*/
Messages postés
60
Date d'inscription
lundi 4 décembre 2006
Statut
Membre
Dernière intervention
11 janvier 2013

si tu ne maintient pas des références aux DataTable etc

Sa veut dire quoi?


Qui ne tente rien, n'a rien
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
87
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
*/