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

  1. 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.
  2. 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.
  3. 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