Middle+
Ինչ հատկանիշներ ունի Dart-ի աղբամոսի հավաքողը?
sobes.tech AI
Պատասխան AI-ից
Դարնագիր հավաքողը Dart-ում օգտագործում է պատմական աղբահավաք (Generational Garbage Collection) ալգորիթմը:
Հիմնական առանձնահատկությունները՝
- Պատմություններ (Generations): Objekտները բաժանվում են երկու սերունդների՝
- Երիտասարդ սերունդ (Young Generation): Այստեղ ստեղծվում են նոր objeկտներ։ Աղբահավաքը այս սերնդում ավելի արագ և հաճախ է տեղի ունենում, քանի որ շատ objeկտներ մահանում են ստեղծվելուց հետո։
- Հին սերունդ (Old Generation): Objekտները, որոնք «ապրում» են մի քանի աղբահավաքային ցիկլներից հետո, տեղափոխվում են այստեղ։ Աղբահավաքը այս սերնդում ավելի հազվադեպ է, բայց ավելի երկար է տևում։
- Ապրելցած objeկտներ (Survivors): Երիտասարդ սերնդի objeկտներ, որոնց վրա հղումներ ունեն այլ objeկտներ, համարվում են «ապրելցած» և կարող են տեղափոխվել հին սերունդ։
- Աղբահավաքի փուլեր:
- Մինոր GC (Minor GC): Արագ աղբահավաք, որը վերաբերում է միայն երիտասարդ սերնդի objeկտներին։
- Մեջոր GC (Major GC): Ավելի երկար աղբահավաք, որը ստուգում է հին սերնդի objeկտները։
- Պատմական աղբահավաքի առավելությունները:
- Կարճաժամկետ objeկտների օպտիմալացում: Շատ աղբը արագ հեռացվում է երիտասարդ սերնդից։
- Ժամանակի նվազեցում ընդհատումների ժամանակ: Շատ հաճախ, բայց կարճ ընդհատումները երիտասարդ սերնդի հավաքման ժամանակ ավելի քիչ նկատելի են, քան հազվադեպ, բայց երկար ընդհատումները ամբողջ հողամասի համար։
- Dart VM-ի աղբահավաքիչը:
- Օգտագործում է հիբրիդային մոտեցում, որը համատեղում է կոպիավորման (copying collector) երիտասարդ սերնդի համար և նշում և տեղափոխում (mark-and-sweep/compact) հին սերնդի համար։
- Կոպիավորման հավաքողը արագ տեղափոխում է կենդանի objeկտները այլ հիշողության տարածք, արդյունավետորեն ազատելով ընթացիկը։
- Նշում և տեղափոխում հին սերնդում գտնում է կենդանի objeկտները և հետո տեղափոխում է դրանք՝ ֆրագմենտացիան վերացնելու համար։
- Աշխատում է անհատականորեն օգտագործողի միջերեսի թելերից, նվազեցնելով բլոկավորումները։
// Օրինակ objeկտների ստեղծում, որոնք պատկանում են երիտասարդ սերնդին
class MyClass {
String name;
MyClass(this.name);
}
void main() {
var obj1 = MyClass("Object 1"); // Կառուցվում է երիտասարդ սերնդում
var obj2 = MyClass("Object 2"); // Կառուցվում է երիտասարդ սերնդում
// Եթե objeկտները չեն պահվում հղումներով, կարող են հավաքվել
// հաջորդ երիտասարդ սերնդի հավաքման ժամանակ։
// Եթե այս objeկտները երկար ապրեն և ունեն հղումներ,
// կարող են տեղափոխվել հին սերունդ։
}