Maison >développement back-end >Golang >La langue Go a-t-elle GC ?
La langue Go a gc. GC fait référence au garbage collection, un mécanisme de gestion automatique de la mémoire ; le langage go prend en charge GC, et le recyclage de l'espace mémoire des objets dans le langage Go est effectué via le mécanisme GC. Pour le langage Go, le GC du langage Go utilise trois couleurs : pas de génération (les objets ne sont pas divisés en générations), pas de tri (les objets ne sont pas déplacés et triés lors du processus de recyclage) et concurrent (exécuté simultanément avec le code utilisateur) .Algorithme de marquage et de balayage.
L'environnement d'exploitation de ce tutoriel : système Windows 7, GO version 1.18, ordinateur Dell G3.
Le mécanisme GC est devenu populaire après que le langage Java ait été largement utilisé. Le dernier langage de script Python prend en charge GC, et GO prend également en charge GC.
Une caractéristique notable du langage Go et du langage C/C++ est que le recyclage de l'espace mémoire des objets dans Go est effectué via le mécanisme GC. Il n'a pas besoin d'être demandé et publié manuellement par des programmeurs comme C++, il est donc relativement. facile dans Go. Des fuites de mémoire sont susceptibles de se produire. Aujourd'hui, nous allons parler du mécanisme GC dans Go.
Qu'est-ce que la GC et à quoi sert-elle ?
GC, nom complet Garbage Collection, est un mécanisme de gestion automatique de la mémoire.
Lorsque la mémoire demandée par le programme au système d'exploitation n'est plus nécessaire, le garbage collection la recycle activement et la réutilise pour que d'autres codes demandent de la mémoire, ou la renvoie au système d'exploitation. Il s'agit d'un processus de recyclage automatique de la mémoire. -level resources , qui est le garbage collection. Le composant du programme responsable du garbage collection est le garbage collector.
La collecte des déchets est en fait un parfait exemple de « la simplicité est compliquée ». D'une part, les programmeurs bénéficient du GC et n'ont pas besoin de s'inquiéter ou de demander et de libérer manuellement de la mémoire. Le GC libère automatiquement la mémoire restante lorsque le programme est en cours d'exécution. D'un autre côté, GC est presque invisible pour les programmeurs. Il n'apparaît que lorsque le programme nécessite une optimisation spéciale en fournissant une API contrôlable pour contrôler le timing et la surcharge d'exécution du GC.
Habituellement, le processus d'exécution du garbage collector est divisé en deux composants semi-indépendants :
Mutator : Ce nom fait essentiellement référence au code du mode utilisateur. Parce que pour le garbage collector, le code en mode utilisateur ne fait que modifier la relation de référence entre les objets, c'est-à-dire qu'il opère sur le graphe d'objets (un graphe orienté de relations de référence entre objets).
Collector : Le code responsable de la collecte des ordures.
L'objet racine dans GC
L'objet racine est également appelé la collection racine dans la terminologie du garbage collection. C'est le premier objet que le garbage collector vérifie lors du marquage du processus, notamment :
Variables globales : variables qui existent tout au long du cycle de vie du programme et qui peuvent être déterminées au moment de la compilation.
Pile d'exécution : chaque goroutine contient sa propre pile d'exécution, qui contient des variables sur la pile et des pointeurs vers les blocs de mémoire tas alloués.
Registre : La valeur du registre peut représenter un pointeur, et ces pointeurs impliqués dans le calcul peuvent pointer vers le bloc de mémoire tas alloué par un évaluateur.
Comment GC est implémenté
L'existence de tous les algorithmes GC peut être attribuée à l'utilisation mixte de deux formes : le suivi et le comptage de références.
Le suivi GC
commence à partir de l'objet racine et procède étape par étape en fonction des informations de référence entre les objets jusqu'à ce que l'ensemble du tas soit analysé et que les objets qui doivent être conservés soient déterminés, recyclant ainsi tous les objets recyclables. L'implémentation de JavaScript par Go, Java et V8 suit toutes GC.
Comptage de références GC
Chaque objet lui-même contient un compteur de référence, qui est automatiquement recyclé lorsque le compteur atteint zéro. Parce que cette méthode présente de nombreux défauts, elle n’est généralement pas utilisée pour rechercher des performances élevées. Python, Objective-C, etc. sont tous des GC à comptage de références.
Actuellement, les méthodes d'implémentation GC les plus courantes incluent :
le type de suivi, qui est divisé en de nombreux types différents, tels que :
Mark scanning : à partir de l'objet racine, les objets qui sont déterminés être en vie sont marqués, et Nettoyer les objets qui peuvent être recyclés.
Organisation du marquage : proposé pour résoudre le problème de la fragmentation de la mémoire, pendant le processus de marquage, les objets sont organisés autant que possible en un morceau de mémoire continu.
Incrémentiel : exécutez le processus de marquage et de nettoyage par lots, en exécutant une petite partie à chaque fois, faisant ainsi progresser progressivement la collecte des déchets, en obtenant un temps quasi réel et presque aucune pause.
Tri incrémental : Sur une base incrémentielle, le processus de tri des objets est ajouté.
Générationnel : Classez les objets en fonction de la durée de leur temps de survie. Ceux dont le temps de survie est inférieur à une certaine valeur sont la jeune génération, ceux dont le temps de survie est supérieur à une certaine valeur sont l'ancienne génération et les objets qui le seront. ne jamais participer au recyclage sont la génération permanente. Et les objets sont recyclés sur la base d'hypothèses générationnelles (si un objet ne vit pas longtemps, il a tendance à être recyclé, si un objet a vécu longtemps, il a tendance à vivre plus longtemps).
Comptage de références : recyclez en fonction du nombre de références de l'objet et recyclez immédiatement lorsque le nombre de références atteint zéro.
La mise en place du GC dans Go
Pour Go, le GC de Go n'utilise aucune génération (les objets ne sont pas divisés en générations), aucun tri (les objets ne sont pas déplacés et collectés lors du processus de recyclage), algorithme de balayage de marques tricolores concurrent (exécuté simultanément avec le code utilisateur). [Recommandations associées : Tutoriel vidéo Go]
Les raisons sont les suivantes :
L'avantage de la défragmentation d'objet est de résoudre le problème de fragmentation de la mémoire et de « permettre » l'utilisation d'un allocateur de mémoire séquentiel. Cependant, l'algorithme d'allocation d'exécution Go est basé sur tcmalloc et il n'y a fondamentalement aucun problème de fragmentation. Et l’allocateur de mémoire séquentiel n’est pas adapté aux scénarios multithread. Go utilise un algorithme d'allocation de mémoire moderne basé sur tcmalloc, et le tri des objets n'apportera pas d'améliorations substantielles des performances.
Le GC générationnel repose sur l'hypothèse générationnelle, c'est-à-dire que le GC place la cible principale de récupération sur les objets nouvellement créés (qui ont des temps de survie courts et sont plus susceptibles d'être recyclés), plutôt que de vérifier fréquemment tous les objets. Cependant, le compilateur de Go stockera la plupart des nouveaux objets sur la pile via une analyse d'échappement (la pile est directement recyclée), et seuls les objets qui doivent exister pendant une longue période seront alloués au tas qui nécessite un garbage collection. En d'autres termes, les objets éphémères recyclés par le GC générationnel sont directement alloués à la pile dans Go. Lorsque la goroutine meurt, la pile sera recyclée directement sans la participation du GC. Par conséquent, l'hypothèse générationnelle n'apporte pas Come. pour un avantage direct. De plus, le garbage collector de Go s'exécute en même temps que le code utilisateur, de sorte que le temps STW n'a rien à voir avec la génération de l'objet et la taille de l'objet. L'équipe Go se concentre davantage sur la façon de mieux permettre à GC de s'exécuter simultanément avec le code utilisateur (en utilisant les processeurs appropriés pour effectuer le garbage collection) plutôt que sur le seul objectif de réduire les temps de pause.
Pour plus de connaissances sur la programmation, veuillez visiter : Vidéo de programmation ! !
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!