Sobes.tech
Middle

Mis on prügikoristuse kontseptsioon C#-s?

sobes.tech AI

Vastus AI-lt

Jäätmete koguja (GC) haldab automaatselt mälu, vabastades selle objektidest, mida programm enam ei kasuta. See töötab automaatselt, vähendades vajadust käsitsi mälu jaotamise ja vabastamise järele, mis vähendab mälu lekkimise ja näitajatega seotud vigade riski.

Jäätmete kogumise protsess hõlmab järgmisi etappe:

  1. Märkimine (Marking): GC määrab, millised objektid on endiselt kasutusel. Selleks alustab ta põhielementide kogumist (näiteks globaalsetest muutujatest või jooksva voogude virnadest) ja märgistab kõik neilt kättesaadavad objektid.
  2. Kompaktsioneerimine (Compacting): GC liigutab elusolevad objektid mälu sees, et vabastada järjestikused plokid tõhusamaks uue mälu jaotamiseks. See etapp uuendab ka liigutatud objektide näitajaid.
  3. Puhastamine (Sweeping): GC vabastab mälu, mis on hõivatud mitte-märgistatud objektidega.

.NET-is on GC generatsiooniline. Mälu jaguneb generatsioonideks:

  • Generatsioon 0 (Gen 0): sisaldab lühiajalisi objekte. Selle generatsiooni kogumine toimub kõige sagedamini.
  • Generatsioon 1 (Gen 1): on vahemälu objektidele, mis on üle elanud Gen 0 kogumise. Seda kogutakse harvemini kui Gen 0.
  • Generatsioon 2 (Gen 2): sisaldab pikaajalisi objekte. Seda kogutakse kõige harvemini ja see nõuab suuremat jõudlust.

Objektid liiguvad generatsioonide vahel "eluea" jooksul kogumise ajal.

Näide objekti loomise ja kasutamise kohta:

// Objekti loomine
MyObject obj = new MyObject();
// Objekti kasutamine
obj.DoSomething();
// Objekt enam ei kasutata, GC võib selle koguda
obj = null;

Võimalik on ka sundida kogumist GC.Collect() abil, kuid tavaliselt ei soovitata, kuna GC optimeerib automaatselt kogumise aega:

// Sundkogu kutsumine
GC.Collect();
GC.WaitForPendingFinalizers(); // oodake finaliseerijate lõpetamist