Sobes.tech
Middle

Dartdagi axlat yig'uvchi haqida nima bilasiz?

sobes.tech AI

AIdan javob

Dart bir yondoshli tozalash yig'uvchisini ishlatadi va bu avlodli yig'ish asosida ishlaydi.

Asosiy xususiyatlar:

  • Avlodli yig'ish: Ob'ektlar ikki avlodga bo'linadi:
    • Yosh avlod: Yangi va qisqa umrli ob'ektlar. Tez-tez yig'iladi.
    • Eski avlod: Uzun umrli ob'ektlar, yosh avlodda bir nechta yig'ishlardan o'tgan. Kamroq yig'iladi.
  • Stop-the-World: Axborotlarni yig'ish uchun dastur (Dart Isolates)ni to'xtatish talab qilinadi. Biroq, yagona ip va optimallashtirishlar tufayli kechikishlar minimal bo'ladi.
  • Mark-and-Sweep: Eski avlodda Mark-and-Sweep algoritmi qo'llaniladi. Avvalo, erishish mumkin bo'lgan ob'ektlar belgilab olinadi, keyin erishib bo'lmaydiganlar o'chiriladi. Yosh avlod uchun Copying Collector algoritmi ishlatiladi, u jonli ob'ektlarni tezda boshqa xotira joyiga ko'chiradi.
  • Yig'ish tsikllari yo'q: Dasturchi xotirani qo'lda boshqarishi yoki GC ni chaqirishi shart emas. Tizim buni avtomatik qiladi.
  • Optimizatsiyalar: Funktsiyalarni inline qilish, turlarni maxsuslashtirish va ob'ektlarni stackda ajratish, tozalash yig'uvchining yukini kamaytiradi.

Masalan, yangi ob'ekt yaratishda:

// Yosh avlod xotirasida yangi ob'ekt yaratish
var myObject = MyClass();

Agar myObject uzoq vaqt xotirada qolsa va mavjud bo'lsa, u vaqt o'tishi bilan "eski" avlodga o'tkaziladi. Agar u erishilmay qolsa, tozalash yig'uvchisi uni oxir-oqibat bo'shatadi.

// myObject endi erishilmaydi, tozalash yig'uvchisi uni yig'ib olishi mumkin
myObject = null;

Dartdagi tozalash yig'uvchisi samarali, ammo u xotira oqib ketishlariga qarshi panacea emas, bu esa kuchli manbalarni saqlash bilan bog'liq bo'lishi mumkin (masalan, bekor qilinmagan obuna).