GC

Životní cyklus objektů a správa paměti v C# – Detailní Přehled

1. Explicitní uvolňování objektů

V C# není explicitní uvolňování paměti běžné, protože .NET framework obsahuje garbage collector (GC), který automaticky spravuje paměť. Nicméně, uvolnění zdrojů jako souborů nebo databázových připojení může být provedeno ručně pomocí metody Dispose, implementované z rozhraní IDisposable.

Příklad:

using (var soubor = new StreamWriter("soubor.txt"))
{
    soubor.WriteLine("Nějaký text");
} // soubor.Dispose() je automaticky volán

Zde using zajistí, že Dispose bude zavolán i při výskytu výjimky.

2. Reference Counting

C# nepoužívá explicitní reference counting pro správu paměti, jak to dělají jazyky jako C++. Místo toho se spoléhá na garbage collector. Nicméně, reference counting může být konceptuálně pochopeno jako sledování počtu odkazů na objekt. Když žádná reference na objekt neexistuje, objekt je považován za způsobilý pro uvolnění.

3. Garbage Collector (GC)

📹
Garbage Collector v C# spravuje paměť a zajišťuje, že objekty, které již nejsou potřebné, jsou automaticky uvolněny. GC je generational (generativní), což znamená, že objekty jsou tříděny do generací:

Implementace a Detailní Správa Paměti

Heaps a Garbage Collection

V .NETu existují dva hlavní heapy:

  1. Small Object Heap (SOH): Pro malé objekty (méně než 85 000 B). Po každé garbage kolekci dochází ke kompaktování, což znamená, že přeživší objekty jsou přesunuty blíže k začátku heapu, aby se uvolnilo místo pro nové objekty.
  2. Large Object Heap (LOH): Pro velké objekty (větší než 85 000 B). Na tomto heapu se neprovádí kompaktování, což může vést k fragmentaci paměti.

Fragmentace paměti může nastat, když jsou v heapu "díry", kde se již neuvolněné objekty nevejdou. To může způsobit vyvolání OutOfMemoryException, i když je celkově dostatek paměti.

Generační správa:

Velikost segmentů:

GC Class v C#

Třída GC poskytuje metody pro interakci s garbage collectorem, například:

Problémy s Garbage Collection

Navzdory efektivnímu GC mohou stále nastat problémy s únikem paměti, například když objekty zůstávají v paměti kvůli přihlášení k událostem nebo když anonymní metody obsahují odkazy na objekty, které nelze uvolnit.

Shrnutí