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

  1. 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.
  2. Konsolidavimas (Compacting). Sumažina atminties fragmentaciją. GC perkelia pasiekiamus objektus į nuoseklų atminties bloką, palikdamas laisvą vietą.
  3. 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 IDisposable objektų finalizatorius. Norint atlaisvinti nevaldomus išteklius, reikia naudoti aiškų išlaisvinimo mechanizmą (Dispose(), using sakinys).
// 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