Sobes.tech
Junior

Чӣ тавр ҷамъкунандаи партовҳо (Garbage Collector) дар C#?

sobes.tech AI

Ҷавоб аз AI

C#-да қоқыс жинағышы .NET іске қосу ортасының (CLR) бір бөлігі болып табылады және автоматты түрде жадыны басқару арқылы қол жетімсіз объектілердің пайдаланып жатқан ресурстарын босатады.

Жұмыс принциптері:

  • Объектілерді бақылау: Қоқыс жинағыш басқарылатын heap-те жасалған объектілерді бақылайды.
  • Қол жетімділікті анықтау: Қандай объектілердің қол жетімді екенін анықтайды (яғни, жарамды сілтемелер бар).
  • Қол жетімсіз объектілерді жинау: Қол жетімсіз объектілер "қоқыс" ретінде қарастырылады және қауіпсіз түрде жойылуы мүмкін.

Жинау процесі келесілерді қамтиды:

  1. Белгілеу (Marking). GC стек пен тіркеушілерді сканерлеп, тамырларды (тамыр объектілерін) табады. Тамырлардан бастап, ол объектілер графын айналып, қол жетімді объектілерді белгілейді.
  2. Компактизация (Compacting). Жадының фрагментациясын азайтады. GC қол жетімді объектілерді үздіксіз жады блогына көшіріп, бос орын қалдырады.
  3. Тазалау (Sweeping). Қол жетімсіз объектілер (белгіленбегендер) жойылады және олардың жады босатылады.

Негізгі ерекшеліктер:

  • Автоматты басқару: Дамытушының жадыны босату бойынша қолмен жауапкершілігін жояды.
  • Жасақтар: Heap жасақтарға бөлінген (Gen 0, Gen 1, Gen 2). Бұл жинауды оңтайландырады, себебі көп объектілер тез қоқысқа айналады. Жаңа объектілер Gen 0-да жасалады. Егер объект Gen 0 жинауынан кейін өмір сүрсе, ол Gen 1-ге көшіріледі және т.б.
  • Финализаторлар және босату (Finalizers and Disposal): GC IDisposable жүзеге асырған объектілер үшін финализаторлардың дереу орындалуын кепілдендірмейді. Басқарылмайтын ресурстарды босату үшін нақты механизм қолданылуы керек (Dispose(), using мәлімдемесі).
// Ресурстарды нақты босату үшін using мәлімдемесін қолдану мысалы
using (var stream = new System.IO.FileStream("temp.txt", System.IO.FileMode.Create))
{
    // Файлмен жұмыс
} // stream.Dispose() автоматты түрде шақырылады