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-тың жинағышы тиімді, бірақ ол ескі объектілерге күшті сілтемелерді сақтау салдарынан пайда болатын жады ағып кетулеріне қарсы емдеу емес (мысалы, тоқтатылмаған жазылулар).