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:
- 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.
- Kompaktimine (Compacting). See aitab vähendada mälupuhverduse fragmentatsiooni. GC liigutab jõukohased objektid ühtlasesse mälupuhvrisse, jättes vaba ruumi.
- 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(),usinglause).
// 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