Junior
Kas yra šiukšlių rinkėjas (Garbage Collector) C#?
sobes.tech AI
Atsakymas iš AI
C# atminties surinkėjas — tai .NET vykdymo aplinkos (CLR) dalis, kuri automatiškai valdo atmintį, išlaisvindama iš išorės nepasiekiamus objektus.
Veikimo principai:
- Objektų stebėjimas: Surinkėjas stebi valdomąją krūvą sukurtus objektus.
- Pasiekiamumo nustatymas: Jis nustato, kurie objektai yra pasiekiami vykdomo kodo (t. y. jiems yra galiojančios nuorodos).
- Nepasiekiamų objektų surinkimas: Objektai, kurie daugiau nepasiekiami, laikomi "šiukšle" ir gali būti saugiai ištrinti.
Atliekant atminties surinkimą, vyksta šie veiksmai:
- Pažymėjimas (Marking). GC skenuoja staką ir registrus, kad rastų šaknis (šakniniai objektai). Nuo šaknų jis apžiūri objektų grafą, pažymėdamas pasiekiamus objektus.
- Konsolidavimas (Compacting). Sumažina atminties fragmentaciją. GC perkelia pasiekiamus objektus į nuoseklų atminties bloką, palikdamas laisvą vietą.
- Išvalymas (Sweeping). Nepasiekiami objektai (nepažymėti) yra ištrinami, o jų atmintis atlaisvinama.
Pagrindinės savybės:
- Automatinis valdymas: Pašalina kūrėjo atsakomybę už atminties išlaisvinimą.
- Kartų sistema (Generations): Krūva padalinta į kartas (Gen 0, Gen 1, Gen 2). Tai optimizuoja surinkimą, nes dauguma objektų greitai tampa šiukšle. Nauji objektai kuriami Gen 0. Jei objektas išgyvena po Gen 0 surinkimo, jis perkeliama į Gen 1 ir t. t.
- Finišatoriai ir išmetimas (Finalizers and Disposal): GC garantuoja ne iš karto vykdyti
IDisposableobjektų finalizatorius. Norint atlaisvinti nevaldomus išteklius, reikia naudoti aiškų išlaisvinimo mechanizmą (Dispose(),usingsakinys).
// Pavyzdys, kaip naudoti `using` sakinį aiškiai išlaisvinant išteklius
using (var stream = new System.IO.FileStream("temp.txt", System.IO.FileMode.Create))
{
// Darbas su failu
} // stream.Dispose() bus iškviestas automatiškai