Sobes.tech
Junior

Mis on prügikoristaja (Garbage Collector) C#-s?

sobes.tech AI

Vastus AI-lt

C# mälu kogumise tööriist — see on osa .NET-i täitmisest (CLR), mis haldab automaatselt mälu, vabastades ressursid, mida hõivavad mitte-juurdepääsetavad objektid.

Tööpõhimõtted:

  • Objektide jälgimine: Kogumismasin jälgib hallatava virna, kus on loodud objektid.
  • Juurdepääsetavuse määramine: Ta määrab, millised objektid on jõukohased jooksva koodi jaoks (st neil on kehtivad viited).
  • Juurdepääsetamatute objektide kogumine: Objektid, mis enam ei ole jõukohased, loetakse "prügiks" ja neid saab ohutult kustutada.

Mälu kogumise protsess hõlmab:

  1. Märkimine (Marking). GC skaneerib virna ja registrid, et leida juuri (juurobjektid). Juurest lähtudes jälgib ta objekti graafi, märgistades jõukohased objektid.
  2. Kompaktimine (Compacting). See aitab vähendada mälupuhverduse fragmentatsiooni. GC liigutab jõukohased objektid ühtlasesse mälupuhvrisse, jättes vaba ruumi.
  3. Puhastamine (Sweeping). Juurdepääsetamatud objektid (märkamatud) kustutatakse ning nende mälu vabastatakse.

Peamised omadused:

  • Automaatne haldus: Vähendab arendaja vastutust mälu vabastamise eest.
  • Põlvkonnad (Generations): Virn jaguneb põlvkondadeks (Gen 0, Gen 1, Gen 2). See optimeerib kogumist, kuna enamik objekte muutub kiiresti prügiks. Uued objektid luuakse Gen 0-s. Kui objekt jääb ellu pärast Gen 0 kogumist, liigub ta Gen 1-sse ja nii edasi.
  • Finišerid ja mahavõtmine (Finalizers and Disposal): GC ei garanteeri, et IDisposable-i rakendavad objektide finaliseerijad täidetakse kohe. Mittetulundusressursside vabastamiseks tuleks kasutada selget vabastamismehhanismi (Dispose(), using lause).
// Näide, kuidas kasutada `using` lauset ressursside selgeks vabastamiseks
using (var stream = new System.IO.FileStream("temp.txt", System.IO.FileMode.Create))
{
    // Töö failiga
} // stream.Dispose() kutsutakse automaatselt