Sobes.tech
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.