Sobes.tech
Middle+

Hoe werkt de garbage collector in de programmeertaal Go?

sobes.tech AI

Antwoord van AI

De garbage collector in Go is gebaseerd op een mark-and-sweep algoritme met een trigger die gebaseerd is op geheugenallocatie. Het werkt parallel aan het hoofdprogramma en minimaliseert pauzes.

Belangrijke punten:

  • Drie kleursets:
    • Wit: Objecten die niet bezocht zijn en mogelijk afval.
    • Grijs: Objecten die toegankelijk zijn vanaf de roots, maar nog niet gescand.
    • Zwart: Objecten die toegankelijk zijn vanaf de roots en al gescand.
  • Markering: De collector begint bij de roots (globale variabelen, stack van elke goroutine), markeert toegankelijke objecten als grijs. Vervolgens scant hij recursief de grijze objecten, markeert de bereikbare als grijs, en de gescande objecten worden zwart.
  • STW-fase (Stop-The-World) tijdens het markeren: Een korte onderbreking van alle goroutines aan het begin van het markeren om een momentopname van de objectgraf te maken en aan het einde om de toestand te wijzigen.
  • Parallel markeren: Het grootste deel van het markeren gebeurt parallel aan de uitvoering van het programma.
  • Verwijdering: Na het markeren worden alle witte objecten die overblijven als ontoegankelijk beschouwd en vrijgegeven. Go vereist niet expliciet het nulmaken van pointers.
// Voorbeeld: wanneer een object ontoegankelijk wordt
type Data struct {
    value int
}

func main() {
    d1 := &Data{value: 10} // Object gemaakt, toegankelijk
    _ = d1                 // Gebruik van het object

    d1 = nil // Het object is niet meer toegankelijk via de variabele d1.
            // De garbage collector kan het vrijmaken in de volgende cyclus.

    // Andere objecten waar niemand naar verwijst, kunnen ook worden verzameld.
}
  • Trigger: De collector wordt gestart wanneer de toegewezen geheugen groter wordt dan een drempel die afhangt van de vorige toegewezen geheugen. Standaard is deze drempel twee keer de vorige gebruikte hoeveelheid.
  • Doel: Een lage latentie behouden door lange "Stop-The-World"-pauzes te vermijden.
// Het gedrag van de collector kan worden beheerd via omgevingsvariabelen
// bijvoorbeeld door GOGC=off in te stellen, wordt garbage collection uitgeschakeld.

Over het algemeen is de garbage collector van Go efficiënt en vereist minimale tussenkomst van de ontwikkelaar.