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

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