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.