0Pricing
Go Academy · Leçon

Fonctionnement interne du ramasse-miettes

Marquage-balayage tricolore, GOGC et pauses du GC

Fonctionnement interne du ramasse-miettes est une leçon Go Academy gratuite sur CoddyKit. Ceci est la leçon 3 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Go Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Go Academy comprend 4 leçons au total.

Marquage et balayage tricolores

Le ramasse-miettes de Go utilise un algorithme concurrent de marquage et de balayage tricolores. Les objets sont blancs (non visités), gris (trouvés, mais dont les enfants n’ont pas été analysés) ou noirs (entièrement analysés). Les objets blancs sont considérés comme des déchets lors du balayage.

Ramasse-miettes concurrent

Le ramasse-miettes de Go s’exécute principalement en parallèle des goroutines de l’application. Cela réduit les pauses d’arrêt du monde (STW) à moins d’une milliseconde dans la plupart des programmes.

Barrière d’écriture

Une barrière d’écriture intercepte les écritures de pointeurs pendant la phase de marquage concurrent afin de maintenir l’invariant selon lequel les objets noirs ne pointent pas vers des objets blancs. Elle ajoute un léger surcoût à chaque écriture de pointeur.

Phases STW

Deux courtes pauses STW par cycle du ramasse-miettes : (1) préparation du marquage (activation de la barrière d’écriture, capture des piles des goroutines), (2) fin du marquage (vérification que tous les objets gris ont été analysés). P99 est généralement <1ms.

GOGC

Le déclenchement du ramasse-miettes est contrôlé par GOGC (valeur par défaut : 100). Cela signifie « exécuter le ramasse-miettes lorsque la taille du tas actif double par rapport au précédent ramasse-miettes ». La valeur GOGC=50 déclenche un ramasse-miettes plus fréquent avec moins de mémoire ; la valeur GOGC=200 déclenche un ramasse-miettes moins fréquent avec davantage de mémoire.

GOMEMLIMIT

GOMEMLIMIT (Go 1.19+) définit une limite mémoire souple. Lorsque le tas s’approche de cette limite, le GC s’exécute plus agressivement, quelle que soit la valeur de GOGC. Utilisez-le pour éviter les arrêts provoqués par un OOM dans les environnements où la mémoire est limitée.

import "runtime/debug"
debug.SetMemoryLimit(512 * 1024 * 1024)

Cadencement

Le GC ajuste son rythme pour terminer le marquage avant que le tas ne se remplisse par rapport à GOGC. Si le taux d’allocation est élevé, il augmente le nombre de goroutines qui participent au marquage (aides au marquage).

runtime.GC()

L’appel à runtime.GC() force immédiatement un cycle du GC. Cela est utile dans les tests pour garantir l’exécution des finaliseurs, ou dans les comparaisons de performances pour commencer avec un tas propre. Ne l’appelez pas en production.

Finaliseurs

Enregistrez une fonction à exécuter lorsqu’un objet est récupéré par le GC avec runtime.SetFinalizer. Les finaliseurs s’exécutent dans une goroutine dédiée après le GC. Évitez-les pour le nettoyage des ressources : utilisez plutôt des méthodes Close().

Métriques du GC

Lisez les statistiques du GC avec runtime.ReadMemStats ou exposez-les via les métriques Prometheus. Champs clés : NumGC, PauseNs, HeapAlloc, HeapInuse.

var m runtime.MemStats
runtime.ReadMemStats(&m)
fmt.Printf("GC cycles: %d, last pause: %dns\n", m.NumGC, m.PauseNs[(m.NumGC+255)%256])

Récupérateur

Un récupérateur en arrière-plan restitue au système d’exploitation la mémoire inactive du tas. Il s’exécute simultanément et son rythme est ajusté afin de ne pas affecter les performances au premier plan. L’appel système MADV_FREE ou MADV_DONTNEED est utilisé.

Vérification rapide

Que fait GOMEMLIMIT dans Go 1.19+ ?

Récapitulatif : mécanismes internes du GC

Points clés :

  • Marquage-compaction tricolore concurrent ; deux brèves pauses STW
  • GOGC contrôle le ratio de croissance du tas ; valeur par défaut : 100 (une croissance de 100 % déclenche le GC)
  • GOMEMLIMIT assure la sécurité vis-à-vis de la mémoire des conteneurs (Go 1.19+)
  • runtime.ReadMemStats fournit les métriques du GC

Questions Fréquemment Posées

La leçon « Fonctionnement interne du ramasse-miettes » est-elle gratuite ?

Oui — le texte complet de « Fonctionnement interne du ramasse-miettes » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Go Academy, passe à CoddyKit PRO. Le cours Go Academy comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Fonctionnement interne du ramasse-miettes » ?

Marquage-balayage tricolore, GOGC et pauses du GC Tu pratiques Go Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer Go Academy ?

Aucune expérience préalable n'est requise. Go Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 3 sur 4.

Combien de temps prend la leçon « Fonctionnement interne du ramasse-miettes » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon Go Academy ?

Oui. Chaque leçon Go Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Pile, tas et analyse d’échappement
  2. Modèle mémoire de Go et Happens-Before
  3. Fonctionnement interne du ramasse-miettes
  4. Réduire les allocations : sync.Pool et arènes
← Retour à Go Academy