Middle
Porozprávajte o metódach zberu odpadu (Garbage Collector).
sobes.tech AI
Odpoveď od AI
Metódy zberu odpadu:
- Reference Counting (Počítanie odkazov): Každý objekt uchováva čítač odkazov na seba. Keď čítač dosiahne nulu, objekt sa považuje za odpad a je odstránený.
- Výhody: Jednoduché, ne blokuje vykonávanie hlavného programu na dlhý čas.
- Nevýhody: Nezvláda cyklické odkazy; vyžaduje dodatočný priestor pre čítač v každom objekte.
- Tracing Garbage Collectors (Trasujúce zberače odpadu): Začínajú s množinou "korenových" objektov (napríklad aktívne premenné, zásobník volaní) a rekurzívne prechádzajú všetky objekty dostupné z týchto koreňov. Nedostupné objekty sa považujú za odpad.
- Hlavné stratégie trasovania:
- Mark and Sweep (Značenie a upratovanie):
- Mark (Značenie): Prechod grafom objektov a označovanie všetkých dostupných objektov.
- Sweep (Upratovanie): Druhý prechod pamäťou, odstraňujúci všetky neoznačené objekty.
- Nevýhody: Fragmentácia pamäti.
- Mark and Compact (Značenie a kompaktné usporiadanie):
- Mark (Značenie): Ako v Mark and Sweep.
- Compact (Kompaktné usporiadanie): Presúva živé objekty tak, aby boli usporiadané kontinuálne, čím odstraňuje fragmentáciu.
- Nevýhody: Zložitejšie, môže vyžadovať zastavenie vykonávania programu.
- Copying (Kopírovanie): Pamäť je rozdelená na dve oblasti (polovičné priestory). Pri každom zbere odpadu sa živé objekty z jednej oblasti kopírujú do druhej. Potom sa stará oblasť úplne vyčistí.
- Výhody: Žiadna fragmentácia, rýchla alokácia pamäte po zbere.
- Nevýhody: Vyžaduje dvojnásobok pamäte oproti aktívne využívanej.
- Mark and Sweep (Značenie a upratovanie):
- Hlavné stratégie trasovania:
- Generational Garbage Collection (Generačné zberanie odpadu): Vyplýva z hypotézy, že väčšina objektov žije krátko. Pamäť je rozdelená na generácie (mladé, staré). Objekty sa pri vytvorení umiestňujú do mladého generácie. Ak objekt "prežije" niekoľko zberov v mladom generácii, je presunutý do starého. Zber odpadu sa vykonáva častejšie v mladom generácii.
- Výhody: Efektívne, pretože väčšina práce sa vykonáva v mladom generácii s malým objemom dát.
- Nevýhody: Vyžaduje sledovanie odkazov zo starých generácií na mladé (napríklad pomocou kariet záznamu alebo iných mechanizmov).
Príklady jazykov a ich GC:
- Python: Reference Counting (s cyklickým zberom pre cyklické odkazy).
- Java, C#: Generational, Mark and Sweep, Mark and Compact, Copying (rôzne varianty a kombinácie v závislosti od konkrétnej verzie a nastavení JVM/.NET).
- Go: Concurrent, non-generational Mark and Sweep s optimalizáciami.