Middle
Jaký je koncept sběrného odpadu v C#?
sobes.tech AI
Odpověď od AI
Garbage collector (GC) spravuje paměť automaticky tím, že uvolňuje objekty, které již program nepoužívá. Funguje v automatickém režimu, což odstraňuje potřebu ruční správy alokace a uvolnění paměti, čímž snižuje riziko úniků paměti a chyb souvisejících s ukazateli.
Proces sběru odpadu zahrnuje následující kroky:
- Značení (Marking): GC určuje, které objekty jsou stále používány. Začíná s množinou kořenových objektů (například globální proměnné nebo objekty na zásobnících aktuálních vláken) a označuje všechny přístupné objekty.
- Kompakce (Compacting): GC přesouvá přežívající objekty v paměti, aby uvolnil souvislé bloky pro efektivnější rozdělení nové paměti. Tento krok také aktualizuje ukazatele na přesunuté objekty.
- Úklid (Sweeping): GC uvolňuje paměť obsazenou objekty, které nebyly označeny jako používané.
GC v .NET je generativní. Paměť je rozdělena do generací:
- Generace 0 (Gen 0): Obsahuje krátkodobé objekty. Sběr této generace probíhá nejčastěji.
- Generace 1 (Gen 1): Je bufferem pro objekty, které přežily sběr Gen 0. Sbírá se méně často než Gen 0.
- Generace 2 (Gen 2): Obsahuje dlouhodobé objekty. Sbírá se nejméně často a vyžaduje vyšší výkon.
Objekty se přesouvají mezi generacemi podle "přežití" při sběru odpadu.
Například vytvoření a použití objektu:
// Vytvoření objektu
MyObject obj = new MyObject();
// Použití objektu
obj.DoSomething();
// Objekt již není používán, GC jej může sebrat
obj = null;
Vynucené volání sběru odpadu je možné pomocí GC.Collect(), ale obvykle se nedoporučuje, protože GC automaticky optimalizuje dobu sběru.
// Vynucené spuštění sběru odpadu (většinou nedoporučeno)
GC.Collect();
GC.WaitForPendingFinalizers(); // Čeká na dokončení finalizátorů