Sobes.tech
Junior

Ի՞նչ է C#-ում աղբի հավաքողը։

sobes.tech AI

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

C#-ի գարշահավաքը ավտոմատացված հիշողության կառավարում է։ Այն ազատում է այն օբյեկտների զբաղեցրած հիշողությունը, որոնք ծրագրից արդեն չեն օգտագործվում։

Հիմնական կողմերը՝

  • Ավտոմատ կառավարում՝ ծրագրավորողը մեծամասամբ օբյեկտների համար հիշողությունը ձեռքով հատկացնել կամ ազատել չի պետք։ CLR (Common Language Runtime) դա ինքնուրույն անում է։
  • Հղումների հետևում՝ գարշահավաքը որոշում է, թե որ օբյեկտները հասանելի են արմատային աղբյուրներից (օրինակ, թելերի ստեկ, ստատիկ դաշտեր)։ Այդ աղբյուրներից ոչ մի հղում չունեցող օբյեկտները համարվում են հասանելի չեն և հավաքվում են։
  • Սերունդներ՝ heap-ը (հավաքածուն) բաժանվում է սերունդների՝ 0, 1 և 2։ Սերունդների վերևում գտնվող օբյեկտները, որոնք «ապրում են» հավաքից հետո, տեղափոխվում են բարձր սերունդներ։ Սա օպտիմալացնում է գործընթացը, քանի որ մեծամասնությունը օբյեկտների կարճ կյանք ունի։
  • Վերջացումներ՝ օբյեկտները կարող են ունենալ Finalize մեթոդ, որը գարշահավաքը կանչում է հիշողությունը ազատելուց առաջ։ Օգտագործվում է կառավարումից դուրս ռեսուրսների մաքրման համար, բայց կիրառումը սահմանափակ է՝ անհայտ ժամանակի պատճառով։
  • Կոմպակտացում՝ հավաքից հետո գարշահավաքը կարող է տեղափոխել գոյատևող օբյեկտները՝ հիշողության ֆրագմենտացիան նվազեցնելու համար։
// Կառավարվող heap-ում օբյեկտ ստեղծելու օրինակ
MyClass obj = new MyClass();
// Երբ այլևս չկա հղում obj-ին, գարշահավաքը կարող է ազատել հիշողությունը

// Կառավարումից դուրս ռեսուրսների ձեռքով ազատում՝ IDisposable և using օգտագործելով
// Առաջարկվող մոտեցում՝ փոխարենը Finalize
using (var resource = new UnmanagedResourceWrapper())
{
    // Ռեսուրսի օգտագործում
} // Այստեղ կանչվում է resource.Dispose(), մաքրվում է կառավարումից դուրս ռեսուրսը