Maison >développement back-end >Golang >Golang a-t-il gc ?

Golang a-t-il gc ?

(*-*)浩
(*-*)浩original
2019-12-31 11:24:473004parcourir

Golang a-t-il gc ?

Le garbage collector de GO

Le garbage collection du langage Go utilise généralement l'algorithme classique de marquage et de balayage. (Apprentissage recommandé : GO )

Avant la version 1.3, l'algorithme de garbage collection de Golang est très simple, et puis ses performances sont également largement critiquées : Go Runtime est sous certaines conditions (mémoire (mémoire (mémoire (mémoire (mémoire (mémoire (mémoire (mémoire (mémoire (mémoire (mémoire (mémoire (mémoire (mémoire (mémoire (mémoire (mémoire (mémoire (mémoire (mémoire (mémoire (mémoire (mémoire (mémoire (mémoire (mémoire (mémoire (mémoire (mémoire (mémoire (mémoire (mémoire suspendue, l'opération de marquage et de balayage est effectuée et l'exécution de toutes les tâches démarre une fois l'opération terminée.

Dans les scénarios où beaucoup de mémoire est utilisée, le programme go aura un phénomène de blocage très évident (Stop The World) lors de l'exécution du garbage collection. Dans les processus de service en arrière-plan qui nécessitent une vitesse de réponse élevée, ce type de retard est tout simplement intolérable ! Au cours de cette période, de nombreuses équipes nationales et étrangères qui pratiquaient le langage Go dans des environnements de production avaient plus ou moins marché sur les pièges de gc.

La méthode courante pour résoudre ce problème à cette époque était de contrôler la quantité de mémoire automatiquement allouée dès que possible pour réduire la charge gc, et en même temps, d'utiliser la gestion manuelle de la mémoire pour faire face aux scénarios qui nécessitent de grandes quantités de mémoire et une allocation de hautes fréquences.

À partir de la version 1.3, l'équipe go a commencé à améliorer et à optimiser continuellement les performances de gc. Lorsque chaque nouvelle version de go est publiée, les améliorations de gc sont devenues le centre de l'attention de tous.

Dans la version 1.3, le runtime go sépare les opérations de marquage et de balayage. Comme auparavant, toutes les exécutions de tâches sont suspendues et le marquage est démarré, les tâches suspendues sont redémarrées immédiatement et les tâches de balayage sont effectuées. exécuté en parallèle avec d'autres tâches comme les tâches de coroutine ordinaires.

S'il est exécuté sur un processeur multicœur, go essaiera d'exécuter la tâche gc sur un cœur séparé sans affecter l'exécution du code métier. La propre déclaration de l'équipe Go est que le temps de pause a été réduit de 50 à 70 %.

La version 1.4 (la dernière version stable) n'apporte pas beaucoup de changements de performances à gc. Dans la version 1.4, une grande partie du code d'exécution a remplacé l'implémentation native du langage C par l'implémentation du langage Go. Un changement majeur apporté à gc est qu'il peut obtenir un gc précis.

L'implémentation du langage C ne peut pas obtenir les informations sur les objets de la mémoire pendant gc, elle ne peut donc pas distinguer avec précision les variables ordinaires et les pointeurs. Elle ne peut traiter les variables ordinaires que comme des pointeurs. Si par hasard il y a d'autres objets dans le. espace pointé par cette variable ordinaire, alors Cet objet ne sera pas recyclé.

L'implémentation du langage Go connaît parfaitement les informations de type de l'objet et ne traversera que l'objet pointé par le pointeur lors du marquage, évitant ainsi le gaspillage de mémoire tas dans l'implémentation C (résolvant environ 10 à 30 % ).

Dans la version 1.5, l'équipe go a apporté des améliorations majeures à gc (des préfigurations ont été posées dans la version 1.4, comme l'introduction de la barrière en écriture. L'objectif principal officiel est de réduire les retards).

Le ramasse-miettes implémenté dans go 1.5 est un « ramasse-miettes non générationnel, immobile, simultané, à marquage et balayage tricolore ».

L'algorithme générationnel a été mentionné ci-dessus et constitue une meilleure stratégie de gestion du garbage collection. Cependant, il n'est pas implémenté dans la version 1.5. La raison, je suppose, est que l'étape ne peut pas être trop importante. En amélioration, les responsables de Go ont également déclaré qu'ils seraient pris en compte dans l'optimisation gc de la version 1.6.

En même temps, la méthode de marquage tricolore présentée ci-dessus est introduite. L'opération de marquage de cette méthode peut être exécutée progressivement sans analyser tout l'espace mémoire à chaque fois, ce qui peut réduire le temps d'arrêt du monde. .

Cela montre que les performances de garbage collection de go se sont améliorées jusqu'à la version 1.5, mais pour les systèmes de garbage collection relativement matures (tels que java jvm et javascript v8), go doit optimiser le chemin C'est encore long à venir (mais je crois que l'avenir sera radieux ~).

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