gc
Obsah
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:
Tagy: programming memory-management garbage-collector dotnet java performance
gc.txt · Poslední úprava: autor: admin
