Sobes.tech
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:

  1. Belgilash (Marking). GC stack va registrlarni skanerlash orqali ildizlarni (ildiz ob'ektlar) topadi. Ildizlardan ob'ekt grafigini yurib, erishilgan ob'ektlarni belgilaydi.
  2. Kompaktsiyalash (Compacting). Xotira bo'lakchasini kamaytirishga imkon beradi. GC erishilgan ob'ektlarni uzluksiz xotira blokiga ko'chiradi va bo'sh joy qoldiradi.
  3. 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, IDisposable ni amalga oshirgan ob'ektlar uchun finalizatorlarning darhol bajarilishini kafolatlamaydi. No'zarur resurslarni bo'shatish uchun aniq mexanizm (Dispose(), using bayonoti) 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