Sobes.tech
Middle+

Povězte nám o metodách práce sběrače odpadků (Garbage Collector).

sobes.tech AI

Odpověď od AI

Sběrač odpadu je proces automatického řízení paměti, který uvolňuje paměť obsazenou objekty, jež již program nepoužívá.

Hlavní metody fungování sběrače odpadu:

  1. Počítadlo odkazů:

    • Každý objekt má počítadlo, které uchovává počet odkazů na něj.
    • Při vytváření odkazu na objekt se počítadlo zvyšuje.
    • Při zániku odkazu (například, když proměnná opustí rozsah) se počítadlo snižuje.
    • Když počítadlo dosáhne nuly, objekt je považován za nedosažitelný a jeho paměť je uvolněna.
    • Problémy: Nedokáže zpracovat cyklické odkazy, když dva nebo více objektů odkazují na sebe navzájem, ale jsou nedosažitelné zvenčí.
  2. Traťový sběrač odpadu:

    • Funguje ve dvou fázích: označení a prohledávání nebo zhušťování.
    • Fáze označení: Začíná od "kořenů" (root set) - objektů, které jsou garantovaně dostupné (například globální proměnné, objekty na zásobníku). GC prohledá všechny dosažitelné objekty od kořenů a označí je jako "živé".
    • Fáze prohledávání: GC prohledá celou haldu. Neoznačené objekty jsou považovány za "odpad" a jejich paměť je uvolněna.
    • Kompakce (volitelná): Po prohledávání může GC přesunout "živé" objekty, aby odstranil fragmentaci paměti.
    • Výhody: Umí zpracovat cyklické odkazy.
    • Nevýhody: Může způsobit pauzy ve vykonávání programu (stop-the-world), zatímco GC pracuje.

Nejčastější algoritmy traťových sběračů odpadu:

  • Mark-and-Sweep: Označí živé objekty a poté sbírá odpad.
  • Mark-and-Compact: Označí živé objekty a poté je přesune pro defragmentaci.
  • Kopírování: Dělí haldu na dvě poloviny. Během sběru GC kopíruje živé objekty z jedné poloviny do druhé a poté uvolní původní polovinu.
  • Generační: Vyplývá z hypotézy, že většina objektů umírá mladá. Halda je rozdělena na generace (například mladá a stará). GC častěji sbírá odpad v mladé generaci, což vede k menším pauzám.

Konkrétní metoda fungování sběrače odpadu závisí na používaném programovacím jazyce a jeho implementaci. Například Java a C# používají různé varianty traťových sběračů odpadu, včetně generacích. Python tradičně používal reference counting s doplňkovým mechanismem pro detekci cyklických odkazů, a v novějších verzích jsou také používány prvky traťového sběru.