Middle
Aký je koncept zberu odpadu v C#?
sobes.tech AI
Odpoveď od AI
Zberač smeti (GC) automaticky spravuje pomnilnik tako, da ga sprosti od objektov, ki jih program več ne uporablja. Deluje v samodejnem načinu, kar odpravlja potrebo po ročnem upravljanju dodeljevanja in sproščanja pomnilnika, s čimer se zmanjša tveganje za uhajanje pomnilnika in napake, povezane z kazalci.
Proces zbiranja smeti vključuje naslednje faze:
- Označevanje (Marking): GC določi, kateri objekti so še vedno v uporabi. Začne z nizom korenskih objektov (npr. globalne spremenljivke ali objekti na skladih trenutnih niti) in označi vse dostopne od njih objekte.
- Kompaktiranje (Compacting): GC premakne preživete objekte v pomnilnik, da sprosti sosednje bloke za učinkovitejšo razporeditev novega pomnilnika. Ta faza prav tako posodobi kazalce na premaknjene objekte.
- Pometanje (Sweeping): GC sprosti pomnilnik, ki ga zasedajo objekti, ki niso bili označeni kot v uporabi.
GC v .NET je generacijski. Pomnilnik je razdeljen na generacije:
- Generacija 0 (Gen 0): Vsebuje kratkoročne objekte. Zbiranje te generacije se dogaja najpogosteje.
- Generacija 1 (Gen 1): Je buffer za objekte, ki so preživeli zbiranje Gen 0. Zbira se redkeje kot Gen 0.
- Generacija 2 (Gen 2): Vsebuje dolgoročne objekte. Zbira se redkeje in zahteva večjo zmogljivost.
Objekti se premikajo med generacijami glede na "preživetje" med zbiranjem smeti.
Na primer, ustvarjanje in uporaba objekta:
// Ustvarjanje objekta
MyObject obj = new MyObject();
// Uporaba objekta
obj.DoSomething();
// Objekt ni več v uporabi, GC ga lahko zbira
obj = null;
Začasni klic zbiranja smeti je možen z GC.Collect(), vendar se običajno ne priporoča, saj GC samodejno optimizira čas zbiranja.
// Začasno izvajanje zbiranja smeti (ni priporočljivo v večini primerov)
GC.Collect();
GC.WaitForPendingFinalizers(); // Čakanje na finalizatorje