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

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

Votre réponse

7 réponses

Meilleure réponse
Messages postés
4947
Date d'inscription
lundi 17 février 2003
Dernière intervention
14 février 2014
- 5 sept. 2005 à 16:36
3
Merci
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

Merci sebmafate 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 90 internautes ce mois-ci

Commenter la réponse de sebmafate
Messages postés
4947
Date d'inscription
lundi 17 février 2003
Dernière intervention
14 février 2014
- 5 sept. 2005 à 15:12
0
Merci
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
Messages postés
3248
Date d'inscription
lundi 25 avril 2005
Dernière intervention
27 octobre 2012
- 5 sept. 2005 à 15:59
0
Merci
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
Messages postés
4
Date d'inscription
mercredi 25 août 2004
Dernière intervention
5 septembre 2005
- 5 sept. 2005 à 16:04
0
Merci
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
Messages postés
3248
Date d'inscription
lundi 25 avril 2005
Dernière intervention
27 octobre 2012
- 5 sept. 2005 à 16:13
0
Merci
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
Messages postés
475
Date d'inscription
jeudi 19 juin 2003
Dernière intervention
3 novembre 2008
- 5 sept. 2005 à 19:40
0
Merci
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
Messages postés
3248
Date d'inscription
lundi 25 avril 2005
Dernière intervention
27 octobre 2012
- 5 sept. 2005 à 23:27
0
Merci
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.