====== Garbage Collector (GC) ====== **Garbage Collector** je komponenta běhového prostředí (runtime), která automaticky spravuje přidělování a uvolňování paměti typu **Heap** (haldy). Díky GC se vývojáři nemusí starat o manuální mazání objektů, což předchází kritickým chybám, jako jsou úniky paměti (memory leaks). ===== 1. Hlavní úkoly GC ===== * **Alokace paměti:** Vyhledává volné místo na haldě pro nové objekty. * **Identifikace mrtvých objektů:** Zjišťuje, které objekty již nejsou v programu dosažitelné (žádná proměnná na ně neodkazuje). * **Uvolňování paměti:** Odstraňuje tyto objekty a vrací paměť operačnímu systému nebo ji připravuje pro další použití. * **Kompaktizace (Defragmentace):** Přesouvá zbývající objekty k sobě, aby vznikl souvislý blok volného místa. --- ===== 2. Jak GC funguje: Generační hypotéza ===== Většina moderních GC (zejména v .NET a Javě) pracuje na principu **generací**. Vychází z pozorování, že většina objektů má velmi krátkou životnost. * **Generace 0:** Nejmladší objekty s krátkou životností (např. lokální proměnné v metodě). GC zde běží velmi často a rychle. * **Generace 1:** Přechodná zóna pro objekty, které přežily první úklid. * **Generace 2:** Objekty s dlouhou životností (např. statická data, singletony). Úklid v této generaci je náročný na výkon a děje se méně často (tzv. Full GC). --- ===== 3. Algoritmus Mark-and-Sweep ===== Toto je základní proces, kterým GC prochází paměť: 1. **Mark (Označení):** GC začne od tzv. "kořenů" (roots – např. globální proměnné, zásobník) a projde všechny dosažitelné objekty. Ty označí jako "živé". 2. **Sweep (Smazání):** Všechny objekty, které nebyly označeny, jsou považovány za odpad a jejich paměť je uvolněna. --- ===== 4. Výhody a nevýhody ===== ^ Výhody ^ Nevýhody ^ | **Bezpečnost:** Eliminuje chyby typu "Double Free" nebo "Dangling Pointers". | **Výkonová režie:** GC spotřebovává procesorový čas pro svou vlastní režii. | | **Produktivita:** Vývojář píše méně kódu pro správu zdrojů. | **Pauzy (Stop-the-world):** Při úklidu může dojti ke krátkému pozastavení běhu aplikace. | | **Automatická defragmentace:** Udržuje haldu v dobrém stavu pro rychlou alokaci. | **Nepředvídatelnost:** Programátor přesně neví, kdy k úklidu dojde. | --- ===== 5. Garbage Collector vs. Manuální správa ===== V jazycích jako **C** nebo **C++** musí programátor paměť uvolňovat ručně pomocí příkazů `free()` nebo `delete`. * Pokud zapomene: Vznikne **Memory Leak** (aplikace postupně spotřebuje veškerou RAM). * Pokud smaže příliš brzy: Aplikace spadne při pokusu o přístup k neexistujícím datům. > **Poznámka:** Ani GC není všemocný. Pokud v programu nechtěně držíte odkaz na velký objekt v globální proměnné, GC ho nesmí smazat, i když ho už nepoužíváte. Tomu se říká "logický únik paměti". ---- //Související články:// * [[it:sw:data_types|Přehled datových typů]] * [[it:sw:stack_vs_heap|Stack vs. Heap (Zásobník vs. Halda)]] * [[it:sw:solid|Principy SOLID (správa závislostí)]] //Tagy: {{tag>programming memory-management garbage-collector dotnet java performance}}//