Middle
Koja je koncept sakupljanja smeća u C#?
sobes.tech АИ
Одговор од АИ
Sakupljač smeća (GC) automatski upravlja memorijom, oslobađajući je od objekata koji više nisu u upotrebi od strane programa. Radi u automatskom režimu, eliminirajući potrebu za ručnim upravljanjem dodelom i oslobađanjem memorije, čime se smanjuje rizik od curenja memorije i grešaka povezanih sa pokazivačima.
Proces sakupljanja smeća uključuje sledeće faze:
- Označavanje (Marking): GC određuje koje objekte još uvek koristi. Počinje sa skupom korenskih objekata (npr. globalne promenljive ili objekti na steku trenutnih niti) i označava sve dostupne objekte od njih.
- Kompaktovanje (Compacting): GC pomera preživeli objekat u memoriji kako bi oslobodio susedne blokove za efikasnije raspoređivanje nove memorije. Ovaj korak takođe ažurira pokazivače na pomerene objekte.
- Čišćenje (Sweeping): GC oslobađa memoriju zauzetu od strane objekata koji nisu označeni kao u upotrebi.
GC u .NET je generacioni. Memorija je podeljena na generacije:
- Generacija 0 (Gen 0): Sadrži kratkotrajne objekte. Sakupljanje ove generacije se dešava najčešće.
- Generacija 1 (Gen 1): Je buffer za objekte koji su preživeli sakupljanje Gen 0. Sakuplja se ređe od Gen 0.
- Generacija 2 (Gen 2): Sadrži dugotrajne objekte. Sakuplja se ređe i zahteva veću performansu.
Objekti se pomeraju između generacija u zavisnosti od "preživljavanja" tokom sakupljanja smeća.
Na primer, kreiranje i korišćenje objekta:
// Kreiranje objekta
MyObject obj = new MyObject();
// Korišćenje objekta
obj.DoSomething();
// Objekat više nije u upotrebi, GC ga može sakupiti
obj = null;
Prisilni poziv sakupljanja smeća može se izvršiti pomoću GC.Collect(), ali se obično ne preporučuje, jer GC automatski optimizuje vreme sakupljanja.
// Prisilno izvršenje sakupljanja smeća (nije preporučljivo u većini slučajeva)
GC.Collect();
GC.WaitForPendingFinalizers(); // Čekanje na finalizatore