Gestion Mémoire (Garbage Collector)

Résolu
2pac06
Messages postés
4
Date d'inscription
mercredi 25 août 2004
Statut
Membre
Dernière intervention
5 septembre 2005
- 5 sept. 2005 à 14:53
Lutinore
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Membre
Dernière intervention
27 octobre 2012
- 5 sept. 2005 à 23:27
Bonjour,
je suis confronté, je crois à des fuites de mémoires.
Dans un block unsafe je déclare un tableau de byte :
byte[] bTempo=new byte[2000];
Si le Garbage Collector n'est pas utilisé pour libérer la ressource, comment le faire manuellement ?

De plus si dans un timer (500ms) je déclare une variable de même type que précedent, est ce que la variable est détruite correctement par le garbage collector à chaque 500ms ?

Enfin est-il vrai que le garbage collector aurait tendance a allouer de la mémoire plus rapidement que de dépiler les ressources managés ?

Voici mon environnement de travail pour ce projet :

- Architecture X86 Prcesseur VIA C3 (pas sur un PDA)
- WCE 5.0
- Visual .Net 2003
Merci d'avance pour votre aide précieuse ...
A voir également:

7 réponses

sebmafate
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Membre
Dernière intervention
14 février 2014
38
5 sept. 2005 à 16:36
autant pour moi... mon manque de sommeil de se week end me monopolise les neuronnes...


le GC pose poblème dans les blocks unsafe car il risque de déplacer les informations en mémoire, donc tu risques de te retrouver avec un pointeur dirigeant dans le néan.
C'est pour cela qu'il faut utiliser le block fixed.


le fait de mettre un objet = null permet de libérer la mémoire "manuellement", en effet, c'est un peu comme sur le disque dur, tu pointes sur une zone mémoire et ensuite tu as un chainage, donc si tu coupes la tête implicitement c'est comme si tu libérais les ressources. J'espère que je n'ai pas dit trop de bétises cette fois-ci.

Sébastien FERRAND
3
sebmafate
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Membre
Dernière intervention
14 février 2014
38
5 sept. 2005 à 15:12
le gc ne libère pas les ressources dans les blocks unsafe.

par contre, tu peux faire : bTempo = null;

Sébastien FERRAND
0
Lutinore
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Membre
Dernière intervention
27 octobre 2012
42
5 sept. 2005 à 15:59
Peux tu apporter une précision stp, car après tout le GC il fait bien son boulot dans les blocs unsafe, d'ou l'important de fixer les objets, si l'objet est passé à null, le GC va bien le ramasser; non ?
0
2pac06
Messages postés
4
Date d'inscription
mercredi 25 août 2004
Statut
Membre
Dernière intervention
5 septembre 2005

5 sept. 2005 à 16:04
J'utilise fixed dans le code unsafe, ma question avait plusieurs volets :(je n'ai normalement pas de problème dans le code unsafe)


- a priori en passant ma variable à NULL, il semblerait que cela suffise pour la libérer

Dans mon code la partie la plus sensible serait que j'initialise une variable(byte[] bTempo=new byte[2000]; ) dans un timer (donc tout les 500ms), le GC fait-il bien son travail et libére t-il la mémoire aussi rapidement qu'il ne l'alloue ?
0

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

Posez votre question
Lutinore
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Membre
Dernière intervention
27 octobre 2012
42
5 sept. 2005 à 16:13
Ah non c'est pas automatique, le GC libére la mémoire régulièrement ou alors quand le manque de mémoire se fait sentir.. Tu peux utiliser la méthode GC.Collect mais c'est pas utile dans ce cas à mon avis.
0
cs_badrbadr
Messages postés
475
Date d'inscription
jeudi 19 juin 2003
Statut
Membre
Dernière intervention
3 novembre 2008
1
5 sept. 2005 à 19:40
ce sont des questions de meme que je me pose des fois
le fait de mettre un pointeur un null, ca voudra dire qu'il ne pointe nulle part
mais les données en mémoire sur lesquels ils pointait avant, ils sont tjrs la
est-ce que ca de l'allure ce que je raconte?

@++
0
Lutinore
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Membre
Dernière intervention
27 octobre 2012
42
5 sept. 2005 à 23:27
Si ton pointeur pointe sur un objet non-managé, le passé a null ne remplace pas l'opérateur delete du C++. Si tu as besoin de travailler avec un pointeur sur de la mémoire dans le tas non managé utilise Marshal.AllocCoTaskMem ca remplace la fonction malloc du C et utilise Marshal.FreeCoTaskMem pour libérer la mémoire associée.
0