Gestion Mémoire (Garbage Collector) [Résolu]

2pac06 4 Messages postés mercredi 25 août 2004Date d'inscription 5 septembre 2005 Dernière intervention - 5 sept. 2005 à 14:53 - Dernière réponse : Lutinore 3248 Messages postés lundi 25 avril 2005Date d'inscription 27 octobre 2012 Dernière intervention
- 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 ...
Afficher la suite 

7 réponses

Répondre au sujet
sebmafate 4947 Messages postés lundi 17 février 2003Date d'inscription 14 février 2014 Dernière intervention - 5 sept. 2005 à 16:36
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de sebmafate
sebmafate 4947 Messages postés lundi 17 février 2003Date d'inscription 14 février 2014 Dernière intervention - 5 sept. 2005 à 15:12
0
Utile
le gc ne libère pas les ressources dans les blocks unsafe.

par contre, tu peux faire : bTempo = null;

Sébastien FERRAND
Commenter la réponse de sebmafate
Lutinore 3248 Messages postés lundi 25 avril 2005Date d'inscription 27 octobre 2012 Dernière intervention - 5 sept. 2005 à 15:59
0
Utile
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 ?
Commenter la réponse de Lutinore
2pac06 4 Messages postés mercredi 25 août 2004Date d'inscription 5 septembre 2005 Dernière intervention - 5 sept. 2005 à 16:04
0
Utile
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 ?
Commenter la réponse de 2pac06
Lutinore 3248 Messages postés lundi 25 avril 2005Date d'inscription 27 octobre 2012 Dernière intervention - 5 sept. 2005 à 16:13
0
Utile
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.
Commenter la réponse de Lutinore
cs_badrbadr 475 Messages postés jeudi 19 juin 2003Date d'inscription 3 novembre 2008 Dernière intervention - 5 sept. 2005 à 19:40
0
Utile
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?

@++
Commenter la réponse de cs_badrbadr
Lutinore 3248 Messages postés lundi 25 avril 2005Date d'inscription 27 octobre 2012 Dernière intervention - 5 sept. 2005 à 23:27
0
Utile
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.
Commenter la réponse de Lutinore

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.