Sobes.tech
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):
        1. Mark (Značenie): Prechod grafom objektov a označovanie všetkých dostupných objektov.
        2. 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):
        1. Mark (Značenie): Ako v Mark and Sweep.
        2. 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.
  • 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.