Middle
Povězte mi o metodách sběru odpadu (Garbage Collector).
sobes.tech AI
Odpověď od AI
Metody sběru odpadu:
- Reference Counting (Počítání odkazů): Každý objekt uchovává čítač odkazů na sebe. Když čítač dosáhne nuly, objekt je považován za odpad a je odstraněn.
- Výhody: Jednoduché, nezablokuje dlouhodobě hlavní běh programu.
- Nevýhody: Neřeší cyklické odkazy; vyžaduje dodatečný prostor pro čítač v každém objektu.
- Tracing Garbage Collectors (Trasující sběrače odpadu): Začínají s množinou "kořenových" objektů (například aktivních proměnných, zásobníku volání) a rekurzivně procházejí všechny objekty dostupné z těchto kořenů. Nedostupné objekty jsou považovány za odpad.
- Hlavní strategie trasování:
- Mark and Sweep (Značení a úklid):
- Mark (Značení): Procházení grafu objektů a označování všech dostupných objektů.
- Sweep (Úklid): Druhý průchod pamětí, odstraňující všechny neoznačené objekty.
- Nevýhody: Fragmentace paměti.
- Mark and Compact (Značení a komprese):
- Mark (Značení): Stejně jako v Mark and Sweep.
- Compact (Kompakce): Přesouvá živé objekty tak, aby byly uspořádány kontinuálně, čímž odstraňuje fragmentaci.
- Nevýhody: Složitější, může vyžadovat zastavení běhu programu.
- Copying (Kopírování): Paměť je rozdělena na dvě oblasti (poloviční prostory). Při každém sběru odpadu jsou živé objekty z jedné oblasti kopírovány do druhé. Poté je stará oblast úplně vyčištěna.
- Výhody: Žádná fragmentace, rychlá alokace paměti po sběru.
- Nevýhody: Vyžaduje dvojnásobek paměti oproti aktuálně používané.
- Mark and Sweep (Značení a úklid):
- Hlavní strategie trasování:
- Generational Garbage Collection (Generační sběr odpadu): Vyplývá z hypotézy, že většina objektů žije krátkou dobu. Paměť je rozdělena na generace (mladá, stará). Objekty jsou při vytvoření umístěny do mladé generace. Pokud objekt "přežije" několik sběrů v mladé generaci, je přesunut do staré. Sběr odpadu se častěji provádí v mladé generaci.
- Výhody: Efektivní, protože většina práce se provádí v mladé generaci s malým objemem dat.
- Nevýhody: Vyžaduje sledování odkazů ze starých generací na mladé (například pomocí karet záznamu nebo jiných mechanismů).
Příklady jazyků a jejich GC:
- Python: Reference Counting (s cyklickým sběrem pro cyklické odkazy).
- Java, C#: Generational, Mark and Sweep, Mark and Compact, Copying (různé varianty a kombinace v závislosti na konkrétní verzi a nastavení JVM/.NET).
- Go: Concurrent, non-generational Mark and Sweep s optimalizacemi.