Middle+
Jak funguje sběrač odpadků v jazyce Go?
sobes.tech AI
Odpověď od AI
Garbage collector v Go je založen na algoritmu označování a prohledávání s spouštěčem založeným na alokaci paměti. Funguje paralelně s hlavním programem a minimalizuje pauzy.
Klíčové body:
- Tři sady barev:
- Bílá: Objekt, který nebyl navštíven a je potenciálním odpadem.
- Šedá: Přístupné z kořenů, ale ještě neprohledané objekty.
- Černá: Přístupné z kořenů a již prohledané objekty.
- Označování: Sběrač začíná od kořenů (globální proměnné, zásobník každé gorutiny), označuje přístupné objekty jako šedé. Poté rekurzivně prohledává šedé objekty, označuje jako šedé ty, ke kterým jsou přístupné, a prohledané objekty se stávají černé.
- Fáze STW (Stop-The-World) během označování: Krátké zastavení všech gorutin na začátku označování pro vytvoření snímku grafu objektů a na konci pro změnu stavu.
- Paralelní označování: Většina označování se provádí paralelně s během programu.
- Odstranění: Po označení jsou všechny bílé objekty, které zůstaly, považovány za nedostupné a jsou uvolněny. Go nevyžaduje explicitní nulování ukazatelů.
// Příklad: když se objekt stane nedostupným
type Data struct {
value int
}
func main() {
d1 := &Data{value: 10} // Objekt vytvořen, dostupný
_ = d1 // Použití objektu
d1 = nil // Objekt již není dostupný přes proměnnou d1.
// Sběrač může jej uvolnit v dalším cyklu.
// Další objekty, na které nikdo neukazuje, mohou být také shromážděny.
}
- Spouštěč: Sběrač se spustí, když alokovaná paměť překročí práh závislý na předchozím objemu alokované paměti. Výchozí je dvojnásobek předchozího využitého objemu.
- Cíl: Udržovat nízkou latenci a vyhýbat se dlouhým pauzám "Stop-The-World".
// Chování sběrače lze řídit pomocí proměnných prostředí
// například nastavením GOGC=off se deaktivuje sběr odpadu.
Celkově je garbage collector v Go efektivní a vyžaduje minimální zásah vývojáře.