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:
- Assistance au marquage: Les goroutines utilisateur aident le ramasse-miettes lors de la phase de marquage lors de l'allocation mémoire.
- Marquage: Marquage parallèle des objets accessibles.
- Fin du marquage: Une courte phase STW pour finaliser le marquage.
- 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.