Middle
Ի՞նչ է C#-ում աղբի հավաքման կոնցեպցիան։
sobes.tech AI
Պատասխան AI-ից
Ջահակահավաք (GC) ավտոմատ կերպով կառավարում է հիշողությունը, ազատելով այն այն օբյեկտներից, որոնք այլևս չեն օգտագործվում ծրագրի կողմից: Այն աշխատում է ավտոմատ ռեժիմով, վերացնելով ձեռքով հիշողության բաժանման և ազատման անհրաժեշտությունը, ինչը նվազեցնում է հիշողության լիքների և ցուցիչների հետ կապված սխալների ռիսկը.
Ջահակահավաքի գործընթացը ներառում է հետևյալ փուլերը:
- Նշում (Marking): GC որոշում է, թե որոնք օբյեկտներ դեռ օգտագործվում են: Դրա համար այն սկսում է հիմնական օբյեկտների հավաքածուից (օրինակ՝ գլոբալ փոփոխականներ կամ ընթացիկ հոսքերի ստեկներում գտնվող օբյեկտներ) և նշում է բոլոր հասանելի օբյեկտները:
- Տեղաշարժում (Compacting): GC տեղափոխում է կենդանի օբյեկտները հիշողության մեջ, որպեսզի ազատի contiguous բլոկներ ավելի արդյունավետ նոր հիշողության բաժանման համար: Այս փուլը նաև թարմացնում է նշված օբյեկտների ցուցիչները:
- Մաքառում (Sweeping): GC ազատում է հիշողությունը, որը զբաղեցրած է այն օբյեկտներով, որոնք նշված չեն որպես օգտագործվող:
GC-ը .NET-ում գեներացիոն է: Հիշողությունը բաժանվում է սերնդների:
- Սերունդ 0 (Gen 0): պարունակում է կարճաժամկետ օբյեկտներ: Այս սերնդի հավաքումը տեղի է ունենում հաճախ:
- Սերունդ 1 (Gen 1): պահեստ է այն օբյեկտների համար, որոնք անցել են Gen 0 հավաքը: Ավելի հազվադեպ է հավաքվում, քան Gen 0:
- Սերունդ 2 (Gen 2): պարունակում է երկարաժամկետ օբյեկտներ: Ամենից հազվադեպ է հավաքվում և պահանջում է ավելի բարձր կատարողականություն:
Օբյեկտները տեղափոխվում են սերնդների միջև՝ ըստ "ապրելուն" հավաքների ընթացքում:
Օրինակ՝ օբյեկտի ստեղծում և օգտագործում:
// Օբյեկտի ստեղծում
MyObject obj = new MyObject();
// Օբյեկտի օգտագործում
obj.DoSomething();
// Օբյեկտը այլևս չի օգտագործվում, GC կարող է այն հավաքել
obj = null;
Համոզիչ հավաքի կանչը հնարավոր է GC.Collect()-ի միջոցով, բայց սովորաբար դա չի խորհուրդ տրվում, քանի որ GC-ը ավտոմատ կերպով օպտիմիզացնում է հավաքների ժամանակը:
// Հավաքի ուժեղ կանչ (շատ դեպքերում չի խորհուրդ տրվում)
GC.Collect();
GC.WaitForPendingFinalizers(); // սպասում է ֆինալիզատորների ավարտին