Sobes.tech
Junior

Ի՞նչ է garbage collector-ը (մաքրման հավաքիչը) C#-ում։

sobes.tech AI

Պատասխան AI-ից

C#-ի աղբամանի հավաքողը .NET գործարկման միջավայրի (CLR) մաս է, որը ավտոմատ կերպով կառավարում է հիշողությունը՝ ազատելով ռեսուրսները, որոնք զբաղեցրած են արդեն հասանելի olmayan օբյեկտների կողմից:

Աշխատանքի սկզբունքները՝

  • Օբյեկտների հետևում: Աղբամանի հավաքողը հետևում է կառավարվող heap-ում ստեղծված օբյեկտներին:
  • Հասանելիության որոշում: Որոշում է, թե որ օբյեկտները հասանելի են գործարկվող կոդից (այսինքն՝ ունեն վավեր հղումներ):
  • Հասանելի olmayan օբյեկտների հավաքում: Ավելին, հասանելի olmayan օբյեկտները համարվում են "մաքուր" և կարող են անվտանգ հեռացվել:

Հավաքման գործընթացը ներառում է՝

  1. Նշում (Marking): GC- ն սկանավորում է stack-ը և գրանցումները՝ գտնելու արմատները (արմատային օբյեկտները): Արծաթից սկսած՝ անցնում է օբյեկտների գրաֆը և նշում է հասանելի օբյեկտները:
  2. Կոմպակտում (Compacting): Օգնում է նվազեցնել հիշողության ֆրագմենտացիան։ GC- ն տեղափոխում է հասանելի օբյեկտները միացյալ հիշողության բլոկի մեջ՝ թողնելով ազատ տարածք:
  3. Մաքառում (Sweeping): Անհասանելի օբյեկտները (չնշվածները) հեռացվում են, և նրանց հիշողությունը ազատվում:

Հիմնական առանձնահատկությունները՝

  • Ավտոմատ կառավարում: Հեռացնում է ծրագրավորողի ձեռքով պատասխանատվությունը հիշողությունը ազատելու համար:
  • Ենթամիջավայրեր: Heap-ը բաժանված է ենթամիջավայրերի (Gen 0, Gen 1, Gen 2): Սա օպտիմալացնում է հավաքումը, քանի որ մեծ մասը օբյեկտների արագ մաքրվում է։ Նոր օբյեկտները ստեղծվում են Gen 0-ում։ Եթե օբյեկտը survives է 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() կկոչվի ավտոմատ