Middle+
Vertel over de garbage collector in de programmeertaal Go.
sobes.tech AI
Antwoord van AI
Go gebruikt een parallel, driekleuren, niet-compacterende garbage collector met lage latentie.
Belangrijkste werkprincipes:
- Markeren (Mark): Bepaalt welke objecten bereikbaar zijn vanaf de root-pointers (registers, goroutine-stacks, globale variabelen). Gebruikt een driekleuren algoritme (wit - niet bezocht, grijs - bezocht, maar nakomelingen nog niet gecontroleerd, zwart - bezocht en alle nakomelingen gecontroleerd).
- Schoonmaken (Sweep): Verwijdert onbereikbare objecten (blijven wit) en vrijmaakt geheugen voor hergebruik.
Kenmerken:
- Parallel: Het markeren gebeurt parallel met de uitvoering van de gebruikerscode (STW - Stop-The-World - fasen zijn zeer kort).
- Lage latentie: Ontworpen om pauzes in de applicatie te minimaliseren.
- Niet-compacterend: Verplaatst geen levende objecten in het geheugen, wat fragmentatie kan veroorzaken, maar vereenvoudigt de implementatie en versnelt markering/schoonmaak.
Werkfasen:
- Markeerhulp: Gebruikersgoroutines helpen de garbage collector tijdens de markeerfase bij geheugenallocatie.
- Markering: Parallel markeren van bereikbare objecten.
- Markeereind: Een korte STW-fase om de markering te voltooien.
- Schoonmaken: Parallel verwijderen van onbereikbare objecten.
Beheer:
- Automatisch.
- De drempels voor GC-trigger worden geregeld door de omgevingsvariabele
GOGC. Standaard isGOGC=100, wat betekent dat de verzameling begint wanneer de heapgrootte verdubbelt ten opzichte van de vorige cyclus. - De functie
runtime.GC()start geforceerd de garbage collection, maar het gebruik ervan wordt niet aanbevolen in standaardcode.
package main
import (
"runtime"
"time"
)
func main() {
// Voorbeeld van geforceerde GC-aanroep (zelden nodig)
runtime.GC()
// Voorbeeld van het lezen van GC-statistieken
var memStats runtime.MemStats
runtime.ReadMemStats(&memStats)
// fmt.Printf("Totaal toegewezen geheugen: %v bytes\n", memStats.TotalAlloc)
}
Voordelen:
- Automatisch geheugenbeheer, vermindert de kans op fouten (geheugenlekken, dubbele vrijgaven).
- Ontworpen voor gelijktijdige uitvoering.
Nadelen:
- Niet-deterministische werkingstijd van GC.
- Mogelijke toename in geheugengebruik vergeleken met handmatig beheer.