Maison  >  Article  >  développement back-end  >  Le langage Go doit-il gérer manuellement la mémoire ?

Le langage Go doit-il gérer manuellement la mémoire ?

青灯夜游
青灯夜游original
2022-12-16 15:05:595153parcourir

Le langage go ne nécessite pas de gestion manuelle de la mémoire ; le langage go possède une fonction de gestion de la mémoire intégrée (mécanisme GC), qui 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 s'appliquent à la mémoire, ou la renvoie au système d'exploitation. Ce processus de recyclage automatique des ressources au niveau de la mémoire est. Il s'agit du garbage collection ; et le composant du programme responsable du garbage collection est le garbage collector.

Le langage Go doit-il gérer manuellement la mémoire ?

L'environnement d'exploitation de ce tutoriel : système Windows 7, GO version 1.18, ordinateur Dell G3.

Le langage Go ne nécessite pas de gestion manuelle de la mémoire ; le langage Go a une fonction de gestion de la mémoire intégrée (mécanisme GC), et les développeurs n'ont pas besoin de se soucier de l'application et de la libération de la mémoire, ce qui apporte une grande commodité aux utilisateurs.

Qu'est-ce que la GC et quelle est son utilité ?

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.

Dans les calculs, l'espace mémoire contient deux zones importantes : la zone de pile (Stack) et la zone de tas (Heap) ; la zone de pile stocke généralement les paramètres, les valeurs de retour et les variables locales des appels de fonction, et ne produit pas fragmentation de la mémoire. La gestion du compilateur ne nécessite pas la gestion du développeur ; la zone de tas générera des fragments de mémoire. Dans le langage Go, les objets dans la zone de tas sont alloués par l'allocateur de mémoire et recyclés par le garbage collector. Le collecteur 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.
Objet racine dans GC

L'objet racine est également appelé 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 :

    Global. variables : les variables qui existent tout au long du cycle de vie du programme 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.

Garbage collectionDans le langage Go, l'algorithme implémenté par le garbage collector est un collecteur de marques et de scans tricolores simultanés

Le garbage collector s'exécute en même temps que le programme Go , il doit donc être passé par un algorithme de

barrière d'écriture

pour détecter les changements potentiels dans la mémoire. La seule condition pour initier une barrière en écriture est d'arrêter le programme pendant une courte période, c'est-à-dire "Stop the World"

Le langage Go doit-il gérer manuellement la mémoire ?

Le but de la barrière en écriture est de permettre au collecteur de maintenir l'intégrité des données sur le tas pendant la collecte

1.1 Principe de mise en œuvreLe garbage collection du langage Go peut être divisé en quatre phases différentes : la terminaison claire, le marquage, la terminaison du marquage et l'effacement. Deux des phases généreront Stop The World (STW)

.

Le langage Go doit-il gérer manuellement la mémoire ?

phase de fin d'effacement

Mettez le programme en pause, tous les processeurs entreront dans le point de sécurité à ce moment-là
  • Si le cycle de récupération de place actuel est déclenché de force, nous devons également nous occuper de l'unité de gestion de la mémoire qui n'a pas été nettoyé
mark Stage (STW)

    Basculez l'état sur
  • , activez les barrières d'écriture, l'assistance au programme utilisateur (Mutator Assists) et mettez l'objet racine en file d'attente

  • Reprenez le programme d'exécution, le processus de marquage et le programme utilisateur d'assistance commenceront à marquer simultanément les objets dans la mémoire. La barrière d'écriture marquera en gris les pointeurs écrasés et les nouveaux pointeurs, et tous les objets nouvellement créés seront directement marqués. black

  • Démarrez l'analyse de l'objet racine, y compris toutes les piles Goroutine, les objets globaux et les structures de données d'exécution qui ne sont pas dans le tas. Pendant l'analyse de la pile Goroutine, le processeur actuel sera mis en pause

  • Traitez les objets dans le tas. tour à tour, marquez les objets en noir et marquez les objets vers lesquels ils pointent en gris

  • Utilisez un algorithme de terminaison distribué pour vérifier le travail restant et entrez dans la phase de terminaison de marquage après la fin de la phase de marquage

Marquer Phase de terminaison (STW)

  • Mettez le programme en pause, passez le statut à _GCmarktermination et fermez le programme utilisateur marqué auxiliaire _GCmarktermination 并关闭辅助标记的用户程序
  • 清理处理器上的线程缓存

清理阶段

  • 将状态切换至 _GCoff

    Nettoyez le cache des threads sur le processeur
  • Phase de nettoyage
    • Basculez l'état sur _GCoff pour démarrer la phase de nettoyage, initialiser l'état de nettoyage et désactiver la barrière en écriture

Restaurer l'utilisateur programme, tous les objets nouvellement créés seront marqués en blanc

Nettoyez simultanément toutes les unités de gestion de mémoire en arrière-plan Lorsque Goroutine demande une nouvelle unité de gestion de mémoire, le nettoyage sera déclenché

  • 1.2 Trois couleurs. méthode de marquage
Un algorithme de marquage à trois couleurs marquera les objets dans le programme. Divisé en trois catégories : blanc, noir et gris :

    Objets blancs - déchets potentiels, dont la mémoire peut être récupérée par le ramasse-miettes
  • Objets noirs - les objets actifs, y compris les objets qui n'ont aucune référence à des pointeurs externes et les objets de l'objet racine Objets accessibles

  • Objets gris — Objets actifs, car il y a des pointeurs externes vers des objets blancs, le garbage collector scanne les enfants de ces objets
  • Le principe de fonctionnement du collecteur d'ordures à marques tricolores est simple, vous pouvez le résumer dans les étapes suivantes :
  • Sélectionnez un objet gris dans la collection d'objets gris et marquez-le en noir

Le langage Go doit-il gérer manuellement la mémoire ? Marquez tous les objets pointé par l'objet noir comme gris, en s'assurant que l'objet et l'objet sont Aucun des objets référencés ne sera recyclé

Répétez les deux étapes ci-dessus jusqu'à ce qu'il n'y ait plus d'objets gris dans le graphique d'objet

🎜🎜🎜🎜🎜🎜 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!

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