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 ...

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 37
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
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
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
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
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 ?
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 ?

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 41
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.
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?

@++
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
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.
Rejoignez-nous