.NET Core - Garbage Collection

Dans ce chapitre, nous aborderons le concept de récupération de place qui est l'une des fonctionnalités les plus importantes de la plate-forme de code managé .NET. Le garbage collector (GC) gère l'allocation et la libération de mémoire. Le garbage collector sert de gestionnaire de mémoire automatique.

  • Vous n'avez pas besoin de savoir comment allouer et libérer de la mémoire ou gérer la durée de vie des objets qui utilisent cette mémoire

  • Une allocation est effectuée chaque fois que vous déclarez un objet avec un mot clé «nouveau» ou un type de valeur est encadré. Les allocations sont généralement très rapides

  • Lorsqu'il n'y a pas assez de mémoire pour allouer un objet, le GC doit collecter et disposer de la mémoire résiduelle pour rendre la mémoire disponible pour les nouvelles allocations.

  • Ce processus est connu sous le nom de garbage collection.

Avantages de la collecte des ordures

Le nettoyage de la mémoire offre les avantages suivants:

  • Vous n'avez pas besoin de libérer de la mémoire manuellement lors du développement de votre application.

  • Il alloue également efficacement les objets sur le tas géré.

  • Lorsque les objets ne sont plus utilisés, il récupérera ces objets en effaçant leur mémoire et gardera la mémoire disponible pour les allocations futures.

  • Les objets gérés obtiennent automatiquement un contenu propre pour commencer, de sorte que leurs constructeurs n'ont pas à initialiser chaque champ de données.

  • Il assure également la sécurité de la mémoire en s'assurant qu'un objet ne peut pas utiliser le contenu d'un autre objet.

Conditions pour la collecte des ordures

Le garbage collection se produit lorsque l'une des conditions suivantes est remplie.

  • Le système a une mémoire physique faible.

  • La mémoire utilisée par les objets alloués sur le tas géré dépasse un seuil acceptable. Ce seuil est ajusté en continu au cours du processus.

  • le GC.Collectméthode est appelée et dans presque tous les cas, vous n'avez pas à appeler cette méthode, car le garbage collector s'exécute en continu. Cette méthode est principalement utilisée pour des situations et des tests uniques.

Générations

Le garbage collector .NET a 3 générations et chaque génération a son propre tas utilisé pour le stockage des objets alloués. Il existe un principe de base selon lequel la plupart des objets ont une durée de vie courte ou longue.

Première génération (0)

  • Dans la génération 0, les objets sont d'abord alloués.

  • Dans cette génération, les objets ne vivent souvent pas après la première génération, car ils ne sont plus utilisés (hors de portée) au moment du prochain garbage collection.

  • La génération 0 est rapide à collecter car son tas associé est petit.

Deuxième génération (1)

  • Dans la génération 1, les objets ont un espace de seconde chance.

  • Les objets qui sont de courte durée mais survivent à la collection de génération 0 (souvent basée sur un timing coïncident) vont à la génération 1.

  • Les collectes de génération 1 sont également rapides car le tas associé est également petit.

  • Les deux premiers tas restent petits car les objets sont collectés ou promus vers le tas de génération suivante.

Troisième génération (2)

  • Dans la génération 2, tous les objets longs sont vécus et son tas peut devenir très volumineux.

  • Les objets de cette génération peuvent survivre longtemps et il n'y a pas de tas de nouvelle génération pour promouvoir davantage les objets.

  • Le garbage collector dispose d'un tas supplémentaire pour les objets volumineux connu sous le nom de tas d'objets volumineux (LOH).

  • Il est réservé aux objets de 85 000 octets ou plus.

  • Les grands objets ne sont pas alloués aux tas générationnels mais sont alloués directement à la LOH

  • Les collectes de génération 2 et LOH peuvent prendre un temps notable pour les programmes qui ont été exécutés pendant une longue période ou qui fonctionnent sur de grandes quantités de données.

  • Les grands programmes de serveur sont connus pour avoir des tas de 10 Go.

  • Le GC utilise une variété de techniques pour réduire la durée pendant laquelle il bloque l'exécution du programme.

  • L'approche principale consiste à effectuer autant de travail de ramasse-miettes que possible sur un thread d'arrière-plan d'une manière qui n'interfère pas avec l'exécution du programme.

  • Le GC expose également quelques façons pour les développeurs d'influencer son comportement, ce qui peut être très utile pour améliorer les performances.