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(), մաքրվում է կառավարումից դուրս ռեսուրսը