Memoire qui augmente

Signaler
Messages postés
448
Date d'inscription
mardi 20 septembre 2005
Statut
Membre
Dernière intervention
26 juillet 2012
-
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
-
Bonjour,
j'ai tuojurs le semem probleme d ememoir euqi augmente et fini par saturer ...
J'ai un timer
achaque tick je vide, puis je charge un datatable a partir d'un dataadapter ( odbc)
et c monte ... pour arriver a ressources systemes insuffisantes ...

J'ai essayé d eplusieurs manieres :
- en ayant un datatable "globale" donc que je vide puis que je rempli
- en creant et detruisant le datatable a chaque chargement

meme resultat , au bout de dix minutes j'obtiens le message d'erreur ...

Savez vous commet resoudre ce probleme et d'ou il peut venir ( j'ai essayé des truc savec garbage collector et ca ne semble pas resoudre le pb non plus)
a moins que je l'utilise mal ...

bon je met toujours mon petit bout de code :
        void charger()
        {
            DataSet dt = new DataSet();
            da.Fill(dt);
            dt.Dispose();
            dt = null;
            GC.Collect();
        }

4 réponses

Messages postés
94
Date d'inscription
lundi 7 juillet 2008
Statut
Membre
Dernière intervention
7 mars 2009
1
Salut cudenetf !

Tout d'abord, fais "un peu plus" attention a ton orthographe, car il faut vraiment en vouloir pour se forcer à lire tes hiéroglyphes...
Pour ce qui est de l'utilisation du GC, ça m'a l'air correct (je ne l'ai utilisé qu'en JAVA, mais c'est 2 langages très proches). Par contre si tu utilise .Dispose, dt = null ne sert à rien !
As-tu pensé que le problème pouvait venir d'ailleurs ? On manque d'infos pour t'aider, mais à première vue si tu explose ta mémoire sa ne devrait pas venir de là...
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
53
Java et C# très proche?
Ca fait plus ou moims 6-7ans que je pratique les deux et à mon sens ça n'a pas grand chose en commun sauf que c'est deux langage orienté object. La comparaison s'arrête là (ha oui, une petite note personnelle: j'espère ne plus jamaias devoir faire de java d'ici peu de temps...)

<hr />
-Blog-
-Site Perso-
Messages postés
448
Date d'inscription
mardi 20 septembre 2005
Statut
Membre
Dernière intervention
26 juillet 2012
1
Désolé pour mon ortographe,


faites un test


mon programme est un form qui ne contient qu'un timer ( je met interval=100)


et j'ai ecrit juste la fonction timer_tick

a chaque tick , je charge des données (en plus il n'y a qu'une ligne dans la table) et ca grimpe ...
dites moi ce que vous donne le test, ca ira vite a realiser

(avec un ficher .dbf je vous en aurez bien donner un mais je vois pas comment on met le spieces jointes)
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
86
Salut,

"Par contre si tu utilise .Dispose, dt = null ne sert à rien !"
Dans l'exemple courant c'est vrai, vu que la référence (locale) sera de toute façon invalidée à la sortie de la méthode.
Maintenant imagines que derrière l'appel à Dispose il y ai un traitement de 3 heures avant la sortie de la méthode : la référence ne sera "invalidée" qu'au bout de ce traitement, l'objet ne sera donc pas élligible pour finalisation avant ce laps de temps.

Le pattern Dispose est là pour fournir une manière standard de mettre en place un code de nettoyage des ressources internes de l'objet, pas pour déclencher la finalisation.
Concernant GC.Collect, comme le dit la documentation, son appel ne garanti en rien une libération instantanée de la mémoire pouvant l'être.
Les mécanismes internes du GC continuent leur travail normal.

Pour le problème de crash évoqué ici il faudrait voir si le problème n'est pas ailleurs : le code cité exécuté en boucle ne devrait pas poser de problème (hormis le fait que le GC va consommer du temps à libérer de la mémoire).

/*
coq
MVP Visual C#
CoqBlog
*/