Sobes.tech
Middle+

Kaip veikia šiukšlių surinkėjas Go programavimo kalboje?

sobes.tech AI

Atsakymas iš AI

„Go“ atlieka šiukšlių rinkėją, pagrįstą žymėjimo-ištrynimo algoritmu su atminties paskirstymo trigeriu. Ji veikia paraleliai su pagrindine programa ir minimalizuoja pauzes:

Pagrindiniai punktai:

  • Trys spalvų rinkiniai:
    • Baltas: Objektai, kurie nebuvo aplankyti ir galimai yra šiukšlė:
    • Pilkas: Objektai, prieinami iš šaknų, bet dar neperžiūrėti:
    • Juodas: Objektai, prieinami iš šaknų ir jau peržiūrėti:
  • Žymėjimas: Rinkėjas pradeda nuo šaknų (globalių kintamųjų, kiekvieno gorutino stogo), pažymėdamas prieinamus objektus kaip pilkus. Tada jis rekursyviai skenuoja pilkus objektus, pažymėdamas pasiekiamus iš jų kaip pilkus, o skenuojamus objektus – juodus:
  • STW fazė (Sustabdyti-visur) žymėjimo metu: Trumpas sustabdymas visų gorutinų pradžioje, kad būtų galima sukurti objektų grafiko momentinį vaizdą ir pabaigoje – būsenos perjungimą:
  • Paralelinis žymėjimas: Pagrindinė žymėjimo dalis vyksta kartu su programos veikimu:
  • Šalinimas: Po žymėjimo visi balti objektai laikomi neprieinamais ir atlaisvinami:
// Pavyzdys: kai objektas tampa neprieinamas
type Data struct {
    value int
}

func main() {
    d1 := &Data{value: 10} // Objekto sukūrimas, prieinamas
    _ = d1                 // Objekto naudojimas

    d1 = nil // Objekto daugiau nėra prieinama iš kintamojo d1.
            // Šiukšlių rinkėjas gali jį atlaisvinti kitame cikle.

    // Kiti objektai, į kuriuos niekas nesišaudo, taip pat gali būti surinkti.
}
  • Trigeris: Rinkėjas paleidžiamas, kai paskirta atmintis viršija tam tikrą slenkstį, priklausomai nuo ankstesnio paskirstyto atminties kiekio. Pagal numatytuosius nustatymus šis slenkstis yra dvigubai didesnis už ankstesnį naudojamą atminties kiekį.
  • Tikslas: palaikyti žemą delsą, išvengiant ilgų "Sustabdyti-visur" pauzių:
// Rinkėjo elgseną galima valdyti naudojant aplinkos kintamuosius
// Pavyzdžiui, nustatant GOGC=off, atlieka šiukšlių surinkimą:

Apskritai, Go šiukšlių surinkėjas yra efektyvus ir reikalauja minimalios kūrėjo įsikišimo.