Sobes.tech
Middle+

Parlez du ramasse-miettes (collecteur de déchets) dans le langage Go.

sobes.tech IA

Réponse de l'IA

Go utilise un ramasse-miettes parallèle, à trois couleurs, non compactant et à faible latence.

Principes de fonctionnement principaux:

  • Marquage (Mark): Détermine quels objets sont accessibles à partir des pointeurs racine (registres, piles de goroutines, variables globales). Utilise un algorithme à trois couleurs (blanc - non visité, gris - visité mais descendants non vérifiés, noir - visité et tous les descendants vérifiés).
  • Balayage (Sweep): Supprime les objets inaccessibles (restant blancs) et libère la mémoire pour une réutilisation.

Caractéristiques:

  • Parallèle: Le marquage se fait en parallèle avec l'exécution du code utilisateur (les phases STW - Stop-The-World - sont très courtes).
  • Faibles latences: Conçu pour minimiser les pauses dans l'exécution de l'application.
  • Non compactant: Ne déplace pas les objets vivants en mémoire, ce qui peut entraîner une fragmentation, mais simplifie l'implémentation et accélère le marquage/balayage.

Phases de travail:

  1. Assistance au marquage: Les goroutines utilisateur aident le ramasse-miettes lors de la phase de marquage lors de l'allocation mémoire.
  2. Marquage: Marquage parallèle des objets accessibles.
  3. Fin du marquage: Une courte phase STW pour finaliser le marquage.
  4. Balayage: Suppression parallèle des objets inaccessibles.

Gestion:

  • Automatique.
  • Les seuils de déclenchement du GC sont régulés par la variable d'environnement GOGC. Par défaut, GOGC=100, ce qui signifie que la collecte commencera lorsque la taille du tas double par rapport au cycle de collecte précédent.
  • La fonction runtime.GC() lance la collecte de manière forcée, mais son utilisation n'est pas recommandée dans le code standard.
package main

import (
	"runtime"
	"time"
)

func main() {
	// Exemple d'appel forcé à GC (rare)
	runtime.GC()

	// Exemple de lecture des statistiques GC
	var memStats runtime.MemStats
	runtime.ReadMemStats(&memStats)
	// fmt.Printf("Mémoire totale allouée: %v bytes\n", memStats.TotalAlloc)
}

Avantages:

  • Gestion automatique de la mémoire, réduit la probabilité d'erreurs (fuites de mémoire, double libération).
  • Conçu pour une exécution concurrente.

Inconvénients:

  • Temps de travail du GC non déterministe.
  • Augmentation possible de la consommation mémoire par rapport à une gestion manuelle.