Chiqindi yiguvchi (Garbage Collector) usullari haqida gapiring.
sobes.tech AI
AIdan javob
Qabza tozalovchi — bu avtomatik xotira boshqarish jarayoni bo‘lib, dastur tomonidan endi ishlatilmaydigan ob’ektlar tomonidan band qilingan xotirani ozod qiladi.
Qabza tozalovchining asosiy ishlash usullari:
-
Havola hisoblagichi (Reference Counting):
- Har bir ob’ektning havola hisoblagichi bo‘lib, unga bo‘lgan havolalar sonini saqlaydi.
- Ob’ektga havola yaratilganda, hisoblagich oshadi.
- Havola yo‘qolganida (masalan, o‘zgaruvchi ko‘lamdan chiqganda), hisoblagich kamayadi.
- Agar hisoblagich nolga teng bo‘lsa, ob’ektga erishib bo‘lmaydi va uning xotirasi ozod qilinadi.
- Muammolar: Siklik havolalarni boshqara olmaydi, ya’ni ikki yoki undan ortiq ob’ekt bir-biriga havola qilsa, lekin tashqaridan erishib bo‘lmaydigan bo‘lsa.
-
Izlovchi (Tracing) qabza tozalovchi:
- Ikki bosqichda ishlaydi: belgilash (marking) va tozalash (sweeping) yoki siqish (compacting).
- Belgilash bosqichi: "Daraxt" (root set) — garovga olingan ob’ektlar (masalan, global o‘zgaruvchilar, stackdagi ob’ektlar) dan boshlanadi. GC barcha erishilgan ob’ektlarni yurib, ularni "jonli" sifatida belgilaydi.
- Tozalash bosqichi: GC butun xotirani tekshiradi. Belgilanmagan ob’ektlar "axlat" deb hisoblanadi va ularning xotirasi ozod qilinadi.
- Siqish (ixtiyoriy): Tozalashdan so‘ng, GC "jonli" ob’ektlarni joylashtirishi mumkin, bu xotira bo‘linishini bartaraf etish uchun.
- Afzalliklar: Siklik havolalarni boshqarishi mumkin.
- Kamchiliklar: Dastur bajarilishida to‘xtashlar (stop-the-world) yuzaga kelishi mumkin, GC ishlayotgan paytda.
Eng keng tarqalgan izlovchi qabza tozalovchi algoritmlari:
- Mark-and-Sweep: Jonli ob’ektlarni belgilaydi va keyin axlatni yig‘adi.
- Mark-and-Compact: Jonli ob’ektlarni belgilaydi va ularni joylashtiradi, defragmentatsiya uchun.
- Copying: Xotirani ikki qismga bo‘linadi. To‘plash jarayonida, GC jonli ob’ektlarni bir qismdan ikkinchisiga ko‘chiradi va asl qismni bo‘shatadi.
- Generatsion: Ko‘pchilik ob’ektlar yoshligida o‘ladi degan gipotezaga asoslangan. Xotira avlodlarga bo‘linadi (masalan, yosh va qariyb). GC yosh avlodda ko‘proq to‘playdi, bu esa to‘xtashlarni qisqartiradi.
Qabza tozalovchining aniq ishlash usuli ishlatilayotgan dasturlash tiliga va uning implementatsiyasiga bog‘liq. Masalan, Java va C# turli xil izlovchi qabza tozalovchi variantlarni, jumladan, avlodli variantlarni qo‘llaydi. Python an’anaviy ravishda Reference Counting usulini ishlatgan va siklik havolalarni aniqlash uchun qo‘shimcha mexanizmga ega bo‘lgan, va so‘nggi versiyalarda ham izlovchi elementlar qo‘llaniladi.