Middle
Ինչ գիտես Dart-ի աղբամոսի մասին?
sobes.tech AI
Պատասխան AI-ից
Dart-ը օգտագործում է միակ թելային աղբամանի հավաքիչ, որը հիմնված է սերնդային հավաքման վրա:
Հիմնական հատկանիշներ՝
- Սերնդային հավաքում: Օբյեկտները բաժանվում են երկու սերնդի՝
- Երիտասարդ սերունդ: Նոր, կարճաժամկետ օբյեկտներ։ Հաճախ հավաքվում են։
- Հին սերունդ: Լայնաժամկետ օբյեկտներ, որոնք մի քանի հավաքում են անցել երիտասարդ սերնդում։ Փոքր հաճախությամբ հավաքվում են։
- Stop-the-World: Աղբամանի հավաքումը իրականացնելու համար անհրաժեշտ է դադարեցնել ծրագրի (Dart Isolates) գործարկումը։ Սակայն, միակ թելային և օպտիմիզացիաների շնորհիվ, ուշացումները նվազագույն են։
- Mark-and-Sweep: Հին սերնդում օգտագործվում է Mark-and-Sweep ալգորիթմը։ Նախ նշվում են հասանելի օբյեկտները, ապա անհասանելի օբյեկտները հեռացվում են։ Երիտասարդ սերնդում օգտագործվում է Copying Collector ալգորիթմը, որը արագ տեղափոխում է կենդանի օբյեկտները այլ հիշողության տարածք։
- Անցանկալի ցիկլեր: Ծրագրավորողը պետք է ձեռքով կառավարի հիշողությունը կամ կանչի GC-ը։ Սիստեմը դա անում է ինքնաբերաբար։
- Օպտիմիզացիաներ: Օգտագործվում են ֆունկցիաների inline-ավորումը, տիպերի մասնագիտացումը և օբյեկտների տեղադրումը ստեկում, ինչը նվազեցնում է հավաքչի բեռը։
Օրինակ՝ նոր օբյեկտ ստեղծելիս՝
// Նոր օբյեկտ ստեղծում "միջնորդ" սերնդում
var myObject = MyClass();
Եթե myObject երկար ժամանակ մնա հիշողության մեջ և հասանելի լինի, ժամանակի ընթացքում այն տեղափոխվելու է "հին" սերնդի։ Եթե այն դադարի է հասանելիությունից, հավաքիչը այն ժամանակով ազատում է։
// myObject այժմ հասանելի չէ, կարող է հավաքվել հավաքչի կողմից
myObject = null;
Կարևոր է հասկանալ, որ Dart-ի հավաքիչը արդյունավետ է, բայց ոչ万能 է հիշողության լճակների դեմ, որոնք կարող են առաջանալ՝ պահելով ուժեղ հղումներ այն օբյեկտներին, որոնք արդեն չեն անհրաժեշտ (օրինակ՝ չեղարկված բաժանորդագրություններ):