Sobes.tech
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):
        1. Mark (Značení): Procházení grafu objektů a označování všech dostupných objektů.
        2. 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):
        1. Mark (Značení): Stejně jako v Mark and Sweep.
        2. 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é.
  • 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.