Sobes.tech
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կտները երկար ապրեն և ունեն հղումներ,
  // կարող են տեղափոխվել հին սերունդ։
}