Junior
C# da chiqindilarni yig'uvchi (Garbage Collector) nima?
sobes.tech AI
AIdan javob
C# dagitishdagi axlat to'plovchi .NET ishga tushirish muhitining (CLR) bir qismidir va avtomatik ravishda xotirani boshqaradi, undan foydalanilmaydigan ob'ektlar tomonidan egallangan resurslarni bo'shatadi.
Ishlash prinsiplari:
- Ob'ektlarni kuzatish: Axlat to'plovchi boshqariladigan yirikda yaratilgan ob'ektlarni kuzatadi.
- Erishish mumkinligini aniqlash: U qaysi ob'ektlar erish mumkin ekanligini aniqlaydi (ya'ni, haqiqiy havolalar mavjud bo'lgan ob'ektlar).
- Erishilmaydigan ob'ektlarni yig'ish: Endi erishilmaydigan ob'ektlar "axlat" deb hisoblanadi va xavfsiz tarzda o'chirilishi mumkin.
Yig'ish jarayoni quyidagilarni o'z ichiga oladi:
- Belgilash (Marking). GC stack va registrlarni skanerlash orqali ildizlarni (ildiz ob'ektlar) topadi. Ildizlardan ob'ekt grafigini yurib, erishilgan ob'ektlarni belgilaydi.
- Kompaktsiyalash (Compacting). Xotira bo'lakchasini kamaytirishga imkon beradi. GC erishilgan ob'ektlarni uzluksiz xotira blokiga ko'chiradi va bo'sh joy qoldiradi.
- Tozalash (Sweeping). Belgilangan bo'lmagan erishilmaydigan ob'ektlar o'chiriladi va ularning xotirasi bo'shatiladi.
Asosiy xususiyatlar:
- Avtomatik boshqaruv: Dasturchining xotirani bo'shatish bo'yicha qo'lda mas'uliyatini olib tashlaydi.
- Avlodlar: Yirik boshqariladigan xotira (heap) avlodlarga bo'lingan (Gen 0, Gen 1, Gen 2). Bu, ko'p ob'ektlar tezda axlatga aylanishi sababli, yig'ishni optimallashtiradi. Yangi ob'ektlar Gen 0 da yaratiladi. Agar ob'ekt Gen 0 da yig'ishda saqlanib qolsa, u Gen 1 ga ko'chiriladi va hokazo.
- Finalizatorlar va bo'shatish (Finalizers and Disposal): GC,
IDisposableni amalga oshirgan ob'ektlar uchun finalizatorlarning darhol bajarilishini kafolatlamaydi. No'zarur resurslarni bo'shatish uchun aniq mexanizm (Dispose(),usingbayonoti) ishlatilishi kerak.
// Resurslarni aniq bo'shatish uchun using bayonotidan foydalanish misoli
using (var stream = new System.IO.FileStream("temp.txt", System.IO.FileMode.Create))
{
// Fayl bilan ishlash
} // stream.Dispose() avtomatik chaqiriladi