Maison >développement back-end >Tutoriel C#.Net >Analyse des principes de récupération de place (GC) .NET
Dans le cadre du contenu avancé .NET, le garbage collector (GC en abrégé) est quelque chose que vous devez comprendre. Conformément au principe de « facile à comprendre », cet article expliquera le principe de fonctionnement du garbage collector dans le CLR.
Regardons d'abord l'explication de MSDN : Lorsqu'un nouveau processus est initialisé, il sera réservé au processus de runtime Une région contiguë de l'espace d'adressage. Cet espace d'adressage réservé est appelé le tas géré.
"Le tas géré est aussi un tas", pourquoi dis-tu ça ? Je dis cela parce que j'espère que tout le monde ne sera pas dérouté par la "terminologie". La prémisse de ce point de connaissance est "la différence entre le type valeur et le type référence". On suppose ici que le lecteur connaît déjà le concept important de « les types valeur sont stockés sur la pile et les types référence sont stockés sur le tas. (Les références des types référence sont stockées sur la pile) ». Ainsi, selon cette théorie, le CLR exige que toutes les ressources, à l'exception des types valeur, soient allouées à partir du tas géré.
Le tas géré maintient un pointeur, ici nommé NextObjPtr, qui pointe vers l'emplacement d'allocation du objet suivant dans le tas.
Il s'agit de connaissances informatiques de base. Consultez-les ici pour vous aider à comprendre les concepts « racine » suivants.
Les registres du CPU sont la "mémoire temporaire" du CPU, qui est plus rapide que l'accès à la mémoire. Divisés par la distance du CPU, les plus proches sont les registres, puis le cache (ordinateur niveau un, niveau deux et cache niveau trois) et enfin la mémoire.
Tous champs statiques définis dans la classe , paramètres de méthodes, variables locales
(variables de type référence uniquement), etc. . Ce sont tous des racines, et les pointeurs d'objet dans les registres CPU sont également des racines. Les racines sont les différents points d’entrée que le CLR peut trouver en dehors du tas.Comme le montre la figure ci-dessus, Lorsque l'espace de la génération 0 est plein, le ramasse-miettes commence le recyclage
, les objets inaccessibles (C et E dans la figure ci-dessus) seront recyclés, et les objets survivants seront classés en première génération.Lorsque l'espace de la 0ème génération est plein et que la 1ère génération commence à avoir de nombreux objets inaccessibles de sorte que l'espace est presque plein, les déchets des deux générations seront recyclés . Pour les objets survivants (objets accessibles), la génération 0 est promue à la génération 1 et la génération 1 est promue à la génération 2.
Le mécanisme actuel de collecte de génération CLR est plus "intelligent". Si l'objet nouvellement créé a un cycle de vie court, les déchets de 0ème génération seront immédiatement recyclés par le garbage collector (sans attendre que l'espace soit entièrement rempli). attribué). De plus, si la génération 0 est recyclée et que l'on constate qu'il reste encore de nombreux objets "accessibles" et que
n'a pas libéré beaucoup de mémoire, le budget de la génération 0 sera augmenté à 512 Ko, et l'effet de recyclage sera être transformé en : Le nombre de garbage collection sera réduit, mais une grande quantité de mémoire sera récupérée à chaque fois. Si peu de mémoire a été libérée, le garbage collector effectuera un
recyclage complet (3 générations). Si ce n'est toujours pas suffisant, une exception de "débordement de mémoire" sera levée.
En d'autres termes, le garbage collector ajustera dynamiquement le budget d'espace alloué de chaque génération en fonction de la taille de la mémoire récupérée ! Obtenez une optimisation automatique !
Il y a une idée de base derrière le garbage collection : Les langages de programmation (la plupart) semblent toujours avoir accès à une mémoire illimitée. Et les développeurs peuvent continuer à allouer, allouer et allouer, comme par magie, inépuisable.
Le principe de fonctionnement de base du garbage collector .NET est le suivant : effacer les objets inaccessibles grâce au marquage le plus élémentaire et au principe clair ; puis compresser et organiser la mémoire disponible comme la défragmentation du disque et enfin atteindre les performances les plus élevées grâce à l'optimisation de l'algorithme générationnel ; .
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!