Sobes.tech
Middle+

Comment fonctionne le ramasse-miettes dans le langage de programmation Go?

sobes.tech IA

Réponse de l'IA

Le ramasse-miettes de Go est basé sur un algorithme de marquage et de balayage avec un déclencheur basé sur l’allocation de mémoire. Il fonctionne en parallèle avec le programme principal et minimise les pauses.

Points clés :

  • Trois ensembles de couleurs :
    • Blanc : Objets non visités et potentiellement des déchets.
    • Gris : Objets accessibles depuis les racines, mais encore non scannés.
    • Noir : Objets accessibles depuis les racines et déjà scannés.
  • Marquage : Le ramasse-miettes commence depuis les racines (variables globales, pile de chaque goroutine), en marquant les objets accessibles comme gris. Ensuite, il scanne récursivement les objets gris, en marquant comme gris ceux accessibles depuis eux, et les objets scannés deviennent noirs.
  • Phase STW (Stop-The-World) pendant le marquage : Une brève pause dans l'exécution de toutes les goroutines au début du marquage pour créer une image instantanée du graphe d'objets et à la fin pour changer l'état.
  • Marquage parallèle : La majeure partie du marquage est effectuée en parallèle avec l'exécution du programme.
  • Suppression : Après le marquage, tous les objets qui restent blancs sont considérés comme inaccessibles et sont libérés. Go ne nécessite pas de mettre explicitement les pointeurs à zéro.
// Exemple : lorsqu'un objet devient inaccessible
type Data struct {
    value int
}

func main() {
    d1 := &Data{value: 10} // Objet créé, accessible
    _ = d1                 // Utilisation de l'objet

    d1 = nil // L'objet n'est plus accessible depuis la variable d1.
            // Le ramasse-miettes peut le libérer lors du prochain cycle.

    // D'autres objets auxquels personne ne fait référence peuvent également être collectés.
}
  • Déclencheur : Le ramasse-miettes se déclenche lorsque la mémoire allouée dépasse un seuil dépendant du volume de mémoire allouée précédemment. Par défaut, ce seuil est le double du volume mémoire utilisé précédemment.
  • Objectif : Maintenir une faible latence en évitant de longues pauses "Stop-The-World".
// Le comportement du ramasse-miettes peut être contrôlé via des variables d'environnement
// par exemple, en définissant GOGC=off, la collecte de déchets est désactivée.

Dans l'ensemble, le ramasse-miettes de Go est efficace et nécessite peu d'intervention du développeur.