Maison  >  Article  >  développement back-end  >  Analyse des principes de récupération de place (GC) .NET

Analyse des principes de récupération de place (GC) .NET

怪我咯
怪我咯original
2017-04-05 13:33:441419parcourir

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.

Connaissances de base

Heap géré

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.

Registre du processeur

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.

Racines

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.

Objets accessibles et inaccessibles

Si une racine fait référence à un objet dans le tas, l'objet est "atteignable" "accessible", sinon il est " inaccessible".

La raison du garbage collection

Du point de vue de la composition informatique, tous les programmes doivent résider en mémoire et s'exécuter. Et la mémoire est un facteur limitant (taille). En plus de cela, le tas géré a également des limites de taille. Si le tas géré n'a pas de limite de taille, alors la vitesse d'exécution de C#

est meilleure que celle de c (la structure du tas géré lui permet d'allouer des objets plus rapidement que le tas d'exécution c). En raison des limitations d'espace d'adressage et de stockage, le tas géré doit maintenir son fonctionnement normal via un mécanisme de récupération de place pour garantir que les objets sont alloués sans « débordement de mémoire ».

Principes de base de la collecte des déchets

Le recyclage est divisé en deux étapes : Marquage –> Compression Le processus de

marquage est en fait le processus permettant de déterminer si un objet est accessible. Lorsque toutes les racines ont été vérifiées, le tas contiendra des objets accessibles (marqués) et inaccessibles (non marqués).

Une fois le marquage terminé, entrez dans l'étape de compression. Au cours de cette phase, le garbage collector parcourt linéairement le tas pour trouver des blocs de mémoire contigus pour les objets inaccessibles. Et déplacez les objets accessibles ici pour compacter le tas. Ce processus est quelque peu similaire à la défragmentation de l'espace disque.

Comme le montre la figure ci-dessus, la case verte indique les objets accessibles et la case jaune indique les objets inaccessibles. Une fois les objets inaccessibles effacés, le déplacement des objets accessibles entraîne une compression de la mémoire (devenant plus compacte).

Après le compactage, les variables et les registres CPU "pointeurs vers ces objets" sont désormais invalides, et le garbage collector doit revisiter toutes les racines et les modifier pour pointer vers les nouveaux emplacements mémoire des objets. Cela peut entraîner une baisse significative des performances. Cette perte est également le principal inconvénient du tas géré.

Sur la base des caractéristiques ci-dessus, l'algorithme de recyclage provoqué par la collecte des déchets est également un sujet de recherche. Parce que si vous attendez vraiment que le tas géré soit plein avant de démarrer le garbage collection, ce sera vraiment "lent".

Algorithme de garbage collection – Algorithme de génération

La génération est un mécanisme utilisé par le garbage collector CLR. Son seul but est d'améliorer les performances de l'application. Le recyclage générationnel est évidemment plus rapide que le recyclage de l’ensemble du tas.

Le tas géré CLR prend en charge 3 générations : génération 0, génération 1 et génération 2. L'espace de la génération 0 est d'environ 256 Ko, la génération 1 est d'environ 2 Mo et la génération 2 est d'environ 10 Mo. L'objet nouvellement construit sera attribué à la génération 0,

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 !

Résumé

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn