Le garbage collector dans l’écosystème .NET
Cet article fait partie d’un ensemble d’article sur le Garbage collector. Par conséquent, le but est de mieux comprendre comment le Garbage Collector (GC) gère la mémoire. Cela nous permet d’aller plus loin dans l’analyse de son fonctionnement.
Tout d'abord, je vous invite à lire l'article de niveau un. Cela vous permettra de rafraîchir vos notions sur le Heap et le Stack.
À l'initialisation d'une application, divers sous-systèmes se mettent en place, notamment la pile (stack) et le tas (heap). Ces deux éléments jouent des rôles essentiels dans la gestion de la mémoire. En réalité, derrière ces systèmes se cache une gestion sophistiquée orchestrée par le Garbage Collector (GC). Le GC libère la mémoire des objets non référencés et optimise l'utilisation de l'espace. Cela assure la stabilité et l'efficacité de l'application.
Lorsqu'une application .NET démarre, le système d'exploitation lui alloue un espace d'adressage virtuel (2 Go pour une application 32 bits), souvent bien plus grand que la mémoire physique disponible. Cet espace est divisé en plusieurs sections, telles que la pile, le tas, et le code exécutable. Le garbage collector gère l'allocation et la libération de cette mémoire virtuelle. Celle-ci est appelée tas managé (Heap managed ou Heap).
Lors de l'instanciation d'un objet, le runtime .NET maintient un pointeur d'allocation indiquant l'endroit où le prochain objet sera placé. L'allocation consiste simplement à avancer ce pointeur de la taille de l'objet à allouer.
Le rôle des générations du Garbage Collector
Rapidement, au cours du cycle de vie de la mémoire, celle-ci se fragmente entre les zones disponibles et les zones occupées.
Pour résoudre ce problème, le GC repose sur trois grands principes. Premièrement, il est plus rapide de compacter une partie du tas managé que de le compacter en entier. Deuxièmement, les objets récents ont des durées de vie plus courtes, tandis que les plus anciens en ont de plus longues. Troisièmement, les objets récents sont souvent liés entre eux et accédés par l'application presque en même temps.
Pour optimiser les performances du Garbage Collector et l'accès à la mémoire, le tas est divisé en trois générations (0, 1, 2). Cette séparation permet de traiter distinctement les objets ayant des durées de vie variées, en particulier les objets à long terme. Chaque génération correspond à une durée de vie d'un objet.
- La génération 0 contient les nouvelles instances d'objets
- La génération 1 sert de tampon entre les deux autres, contenant les objets qui ont survécu à un premier cycle de libération de la mémoire.
- La génération 2 abrite les objets ayant des durées de vie plus longues, comme les classes statiques
Ainsi, le Garbage Collector en .NET, en s'appuyant sur ces principes et cette organisation en générations, parvient à gérer efficacement la mémoire, garantissant des performances optimales pour les applications.

