Sobes.tech
Middle+

Ispričajte o metodama rada sakupljača smeća (Garbage Collector).

sobes.tech АИ

Одговор од АИ

Сакупљач смећа је процес аутоматског управљања меморијом који ослобађа меморију заузету од стране објеката који више нису у употреби од стране програма.

Основне методе рада сакупљача смећа:

  1. Бројач референци (Reference Counting):

    • Свакој објекат има бројач који чува број референци на њега.
    • При креирању референце на објекат бројач се повећава.
    • При нестанку референце (нпр. променљива излази из опсега) бројач се смањује.
    • Када бројач достигне нулу, објекат се сматра недоступним и његова меморија се ослобађа.
    • Проблеми: Не може да обрађује цикличне референце када два или више објеката реферишу један на други, али су недоступни споља.
  2. Трасерски сакупљач смећа (Tracing Garbage Collector):

    • Ради у два корака: обележавање (marking) и сакупљање (sweeping) или компримовање (compacting).
    • Корак обележавања: почиње од "корена" (root set) - објеката који су гарантовано доступни (нпр. глобалне променљиве, објекти на стеку). GC обилази све достижне објекте од корена, обележавајући их као "живе".
    • Корак сакупљања: GC прегледа целу хипу. Необележени објекти се сматрају "мрвом" и њихова меморија се ослобађа.
    • Корак компримовања (по жељи): након сакупљања GC може премештати "живе" објекте како би елиминисао фрагментацију меморије.
    • Предности: Може да обрађује цикличне референце.
    • Недостаци: Може изазвати паузе у извршавању програма (стоп-мир), док GC ради.

Најчешће коришћени алгоритми трасерских сакупљача смећа:

  • Mark-and-Sweep: Обележава живе објекте, затим сакупља смеће.
  • Mark-and-Compact: Обележава живе објекте, затим их премешта ради дефрагментације.
  • Copying: Делује купу на две половине. Током сакупљања GC копира живе објекте из једне половине у другу. Затим ослобађа целу почетну половину.
  • Generational: Основан на хипотези да већина објеката умире младом. Купа се дели на генерације (нпр. младо и старо). GC чешће сакупља смеће у младој генерацији, што доводи до мањих пауза.

Конкретна метода рада сакупљача смећа зависи од коришћеног програмског језика и његове реализације. На пример, Java и C# користе различите варијанте трасерских сакупљача смећа, укључујући генерационе. Python је традиционално користио Reference Counting са додатним механизмом за откривање цикличних референци, а у новијим верзијама такође се примењују елементи трасерског сакупљања.