Sobes.tech
Middle+

Povedzte nám o metódach práce zberača odpadu (Garbage Collector).

sobes.tech AI

Odpoveď od AI

Zberač odpadu je proces automatického riadenia pamäte, ktorý uvoľňuje pamäť obsadenú objektmi, ktoré už nie sú používané programom.

Hlavné metódy práce zberača odpadu:

  1. Počítadlo odkazov (Reference Counting):

    • Každý objekt má počítadlo, ktoré uchováva počet odkazov na neho.
    • Pri vytvorení odkazu na objekt sa počítadlo zvyšuje.
    • Pri zmiznutí odkazu (napríklad, premennej vychádza z rozsahu) sa počítadlo znižuje.
    • Keď počítadlo dosiahne nulu, objekt sa považuje za nedostupný a jeho pamäť sa uvoľní.
    • Problémy: Nedokáže spracovať cyklické odkazy, keď dva alebo viac objektov odkazujú na seba, ale sú nedostupné zvonku.
  2. Trajektorický zberač odpadu (Tracing Garbage Collector):

    • Funguje vo dvoch etapách: označovanie (marking) a zber (sweeping) alebo komprimovanie (compacting).
    • Etapa označovania: Začína sa od "korenov" (root set) - objektov, ktoré sú garantovane dostupné (napríklad globálne premenné, objekty na zásobníku). GC prechádza všetky dostupné objekty od koreňov a označuje ich ako "živé".
    • Etapa zberu: GC prechádza celú haldu. Neoznačené objekty sa považujú za "odpad" a ich pamäť sa uvoľní.
    • Etapa komprimovania (voliteľná): Po zbere GC môže premiestniť "živé" objekty, aby odstránil fragmentáciu pamäte.
    • Výhody: Môže spracovať cyklické odkazy.
    • Nevýhody: Môže spôsobovať prestoje v vykonávaní programu (stop-the-world), kým GC pracuje.

Najbežnejšie algoritmy trajektórického zberača odpadu:

  • Mark-and-Sweep: Označuje živé objekty, potom zbiera odpad.
  • Mark-and-Compact: Označuje živé objekty, potom ich premiestňuje na defragmentáciu.
  • Copying: Rozdeľuje haldu na dve polovice. Počas zberu GC kopíruje živé objekty z jednej polovice do druhej. Potom uvoľní celú pôvodnú polovicu.
  • Generational: Je založený na hypotéze, že väčšina objektov zomrie mladá. Halda sa delí na generácie (napríklad, mladé a staré). GC častejšie zbiera odpad v mladšej generácii, čo vedie k menším prestojom.

Konkrétna metóda práce zberača odpadu závisí od používaného programovacieho jazyka a jeho implementácie. Napríklad, Java a C# používajú rôzne varianty trajektórických zberačov odpadu, vrátane generational. Python tradične používal Reference Counting s doplnkovým mechanizmom na detekciu cyklických odkazov, a v novších verziách sa tiež používajú prvky trajektórického zberača.