Middle+
Ispričajte o metodama rada sakupljača smeća (Garbage Collector).
sobes.tech АИ
Одговор од АИ
Сакупљач смећа је процес аутоматског управљања меморијом који ослобађа меморију заузету од стране објеката који више нису у употреби од стране програма.
Основне методе рада сакупљача смећа:
-
Бројач референци (Reference Counting):
- Свакој објекат има бројач који чува број референци на њега.
- При креирању референце на објекат бројач се повећава.
- При нестанку референце (нпр. променљива излази из опсега) бројач се смањује.
- Када бројач достигне нулу, објекат се сматра недоступним и његова меморија се ослобађа.
- Проблеми: Не може да обрађује цикличне референце када два или више објеката реферишу један на други, али су недоступни споља.
-
Трасерски сакупљач смећа (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 са додатним механизмом за откривање цикличних референци, а у новијим верзијама такође се примењују елементи трасерског сакупљања.