Maison > Article > développement back-end > Parlons de plusieurs enjeux majeurs du GC en langage Go
Ces dernières années, le langage Go est devenu de plus en plus populaire et le mécanisme GC est également largement salué dans l'industrie. Cependant, chaque technologie a ses défauts et ses défauts, et le GC du langage Go ne fait pas exception. Cet article abordera plusieurs problèmes majeurs liés au langage Go GC et présentera les améliorations et optimisations mises en œuvre par l'équipe Go de Go 1.5 à Go 1.12.
Tout d'abord, jetons un coup d'œil au mécanisme GC du langage Go.
Dans le langage Go, le mécanisme GC est implémenté par le module d'exécution. Le GC parcourt le graphique d'objets du programme, marquant tous les objets encore utilisés et effaçant les objets non référencés. Pendant ce processus, le programme en cours sera suspendu.
Le mécanisme GC est une fonctionnalité majeure du langage Go. Il permet d'éviter de nombreux problèmes de mémoire, tels que les fuites de mémoire, les pointeurs sauvages, etc. Mais en même temps, cela entraîne également des problèmes de performances, en particulier dans les grands systèmes. Ci-dessous, nous répertorions un par un les problèmes courants du GC.
Lorsque GC est en cours d'exécution, il met tout le programme en pause. Ce problème n'a pas beaucoup d'impact dans les programmes à petite échelle. Mais pour les programmes volumineux nécessitant un traitement simultané élevé, les pauses GC peuvent entraîner une dégradation des performances et augmenter la latence, affectant ainsi l'expérience utilisateur.
GC doit parcourir l'intégralité du graphe d'objets, consommant ainsi beaucoup de ressources CPU et mémoire. Lorsque le graphe d’objets est très complexe, la surcharge du GC augmente considérablement.
Jitter fait référence à la situation dans laquelle la GC est effectuée plusieurs fois dans un intervalle de temps. Lorsque le GC effectue une longue phase de marquage, le programme ne peut pas répondre aux requêtes, provoquant des retards, voire des plantages. Ce problème est particulièrement fréquent dans les systèmes comportant un nombre élevé de requêtes simultanées.
L'éboueur saisira le droit d'exécution du programme lors du recyclage. Si les droits d'exécution d'un programme sont occupés par le garbage collector pendant une longue période, cela peut entraîner de graves problèmes de performances.
Afin de résoudre ces problèmes, l'équipe Go a apporté diverses améliorations GC dans Go 1.5 à Go 1.12. Les améliorations spécifiques sont les suivantes :
L'algorithme de marquage tricolore est un algorithme GC optimisé qui peut optimiser la pause du temps d'exécution du programme pendant l'exécution du GC. Cet algorithme minimise les temps de pause du programme et réduit les problèmes de gigue.
Dans la version Go 1.5, le garbage collector utilise un algorithme de marquage à trois couleurs, ce qui réduit considérablement le temps de pause du GC et la surcharge du processeur. Les versions ultérieures ont apporté des améliorations et des optimisations continues sur cette base, améliorant ainsi les performances globales et la stabilité.
La version Go 1.5 introduit également la fonction de marquage simultané, qui est effectuée pendant la phase de marquage du garbage collector. Cette méthode de marquage peut être exécutée en même temps que le programme est en cours d'exécution, réduisant ainsi le temps de pause du GC.
Dans la nouvelle balise, les objets seront marqués comme « utilisés » ou « inutilisés », ce qui peut réduire considérablement le temps requis pour le marquage simultané. Cette méthode de marquage peut réduire considérablement la gigue et, dans certains cas, l'éliminer complètement.
GC doit vérifier les objets dans le tas, par conséquent, la structure du tas a un grand impact sur les performances. L'équipe Go a commencé à optimiser l'algorithme de traitement du tas dans Go 1.5, notamment en réduisant la fragmentation du tas. Cette amélioration améliore considérablement l’efficacité d’exécution de GC.
Pour un grand nombre de gros objets, car ils affecteront considérablement l'efficacité du GC, ils nécessitent un traitement spécial. Dans les versions précédentes, les objets volumineux étaient classés comme objets persistants et disposaient d'une gestion spéciale GC activée. Mais dans la version Go 1.8, les gros objets sont classés dans la « liste noire », et le GC utilisera cette liste pour déterminer quels gros objets nécessitent un traitement spécial.
Dans les versions précédentes, les programmeurs Go devaient ajuster manuellement les paramètres du GC, tels que la vitesse d'exécution du GC et le seuil du GC. Mais dans la version Go 1.8, Go prend en charge l'ajustement automatique des paramètres GC, qui peut automatiquement équilibrer l'efficacité d'exécution du GC et l'interruption entre les gros objets et les petits objets.
Les versions ultérieures ont continuellement optimisé et amélioré ce mécanisme.
Cet article présente le mécanisme GC dans le langage Go et une série de problèmes qui peuvent être causés par le mécanisme GC. Dans le même temps, afin de résoudre ces problèmes, l'équipe Go a apporté diverses améliorations GC dans Go 1.5 à Go 1.12, notamment un algorithme de marquage à trois couleurs, un marquage simultané, un traitement amélioré du tas, un meilleur traitement des objets volumineux et un ajustement automatique. des paramètres GC attendez. Ces améliorations ont considérablement amélioré les performances et la stabilité de GC, rendant le langage Go encore meilleur dans la gestion des grands systèmes.
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!