objets gérés par le CLR et méthodes du garbage collector
Bonjour,
Normalement pour les objets gérés par le CLR, le CLR gère l'allocation de mémoire pour ces objets .
Mais pour les objets non gérés par le CLR (ex: connexion Bases de donénes, connexion réseau ou COM), il est nécessaire de leur allouer manuellement de la mémoire.
Cependant, pour créer une nouvelle connexion à une base de données, on peut créer une classe connexion dans laquelle on crée un variable qui contiendra la chaine de connexion.
Puis on pourra ensuite instancier cette classe.
La connexion devient-elle alors gérée par le CLR ou pas ?
Car je n'ai pas constaté que j'alloue moi même de la mêmoire pour gérer une connexion de base de données.
Par ailleurs, concernant le processus de destruction d'un objet , je lis que le garbage collector procède en plusieurs étapes:
1-les objets situés sur le heap sont marqués morts "jusqu'à preuve du contraire"
2-les objets références sont marqués vivants
3-les objets non vivants sont déplacés dans la zone nommée "freachabale queue".
4-on défragmente le heap en faisant migrer les objets qui s'y trouvent vers le bas du heap
5-on met à jour les pointeurs vers les objets du heap puisqu'ils ont été déplacés
6-le processus de finalization commence
Pour ce qui est de l'étape n°3, Il est ajouté que le garbage collector vérifie que les objets morts aient une méthode destructor.
Je ne comprends pourquoi existe cette vérification puisque normalement les objets que gère le garbage collector possèdent tous une méthode destructor.
Seuls les objets non gérés par le garbage collector n'en n'ont pas et il faut leur en ajouter un.
Autre question, la freachable queue est-elle située sur le heap ou pas?
Par ailleurs, les méthodes Collect(), WaitForPendingFinalizers, SupressFinalize(), ReRegisterForFinalize(), AddMemoryPressure(), RemoveMemoryPressure() s'appliquent normalement aux objets qui sont gérés par le garbage collector mais qui nécessitent une intervention particulière.
Cependant ces méthodes s'appliquent elles également aux objets qui ne sont pas gérés par le Garbage collector et pour lesquels on souhaite executer le processus de nettoyage de la mémoire , tout comme pour les autres objets gérés automatiquement par le Garbage Collector.
Concernant les méthodes AddMemoryPressure et RemoveMemoryPressure, s'appliquent elles bien aux objets qui ne sont pas gérés par le Garbage collector, pour leur allouer ou de la mémoire manuellement ou en récupérer.
Merci beaucoup de votre réponse sur tous ces points.
Cordialement
curieuse_prog
objets gérés et non gérés par le CLR
Bonjour et merci de ta réponse.
Je reprends quelques unes de tes réponses
Citation:
Ah bon ? Je ne sais pas où tu as vu ça. La grande majorité des classes .NET n'ont pas de destructeur... Tu peux en implémenter un si nécessaire, mais ce n'est pas obligatoire
D'après ce que j'ai compris, dès qu'un objet ne possède plus de référence sur la pile, il devient candidat à la destruction c'est à dire à l'appel de la méthode Finalize(après passage dans la freachable queue).
Quand il est écrit que "que le garbage collector vérifie que les objets morts aient une méthode destructor."pour l'étape n°3 du processus de destruction d'un objet , que cela signifie-t-il exactement alors:qu' il vérifie qu'il peut bien appeler la méthode Finalize pour ces objets?
Tu écris également
Citation:
AddMemoryPressure ne sert pas à allouer de la mémoire. Ca sert simplement à prévenir le GC d'une allocation de mémoire non gérée. Il y a 99.99% de chances que tu n'aies jamais besoin d'appeler cette méthode.
D'après ce que j'ai compris cette méthode permet d'allouer de la mémoire non gérée.
Allouer de la mémoire non gérée signifie-t-il bien allouer de la mémoire pour des objets non gérés par le CLR?
Si c'est le cas, pourquoi n'aurait-on pas besoin d'allouer de la mémoire pour ces objets?
Merci encore beaucoup de tes réponses.
Cela m'aide à voir plus clair dans toutes ces notions.
Cordialement.
new_wave
Je te remercie de ta réponse sur ce point
processus de destruction d'un objet
Bonjour et merci de ta réponse.
Si je peux me permettre je souhaite ajouter quelques informations à ta réponse et te demande d'avoir la gentillesse de bien vouloir les confirmer ou pas
Tu écris
Citation:
En gros, soit l'objet a un finaliseur (i.e. il redéfinit la méthode Finalize, ce qui en C# se fait en déclarant un destructeur), soit non.
S'il n'en a pas, la mémoire (managée) utilisée par l'objet est juste récupérée
S'il en a un, il survit un peu plus longtemps : il est ajoutée à une file de finalisation, qui appellera la méthode Finalize. Une fois la méthode Finalize appelée, la mémoire de l'objet est récupérée.
Je suis d'accord; cependant, un objet peut ne pas posséder de destructeur et implémenter la méthode Dispose pour libérer des ressources non managées.
Est-ce bien exact ?
Autre question, est-il indispensable' d'indiquer qu'on implémente l'interface IDisposable pour implémenter la méthode Dispose ou peut on créer un méthode Dispose sans indiquer qu'on implémente l'interface IDisposable.
Merci encore de ta réponse.
Cordialement.
new_wave