Складальник сміття в v8, ілюстроване керівництво - devschacht - medium
Добре, давайте приступимо.
Що таке v8?
Що таке збирач сміття?
Найважливішим завданням збірки сміття є можливість управління використанням пам'яті конкретною програмою. Такі мови, як C, зазвичай можуть підключатися до управління пам'яттю програми та виділяти і звільняти її в контексті програми. ECMAScript, з іншого боку, не має інтерфейсу для доступу до управління пам'яттю (так, це означає відсутність відповідного API). Що, загалом-то, означає, що всі права на управління пам'яттю ™ в програмі передаються V8.
Оскільки у нас немає доступу до нескінченного обсягу пам'яті, робота збирача сміття полягає в тому, що потрібно перебрати всі об'єкти, для яких виділена пам'ять, і визначити, мертві вони чи ні. Ті, які живі, повинні залишитися в пам'яті, ті, які мертві, видаляються, а пам'ять повертається назад в купу.
Що таке купа. Купа - це неструктурована область, з якої об'єкти отримують виділену пам'ять. Розподіл є динамічним, оскільки розмір / час життя / кількість об'єктів невідомо, тому виділення і звільнення пам'яті відбувається під час виконання програми.
Тому, якщо ми подивимося на конкурентну модель, купа працює безпосередньо зі стеком викликів, так як об'єкти, які відображаються в стеці, вимагають виділення пам'яті. Це буде виглядати приблизно так:

Живий чи мертвий?
Базова перевірка того, чи живий, чи мертвий об'єкт, заснована на тому, чи може клієнт або програма, яка виконує код, досягти його. Найбільш досяжний об'єкт, як ви можете подумати, це, ймовірно, об'єкт, оголошений в кореневій області видимості.
Деякі C ++ Біндінг (або веб-API на клієнті) також є частиною кореня, тому ви можете безпосередньо звертатися до методів типу setInterval.
Про досяжності можна також думати так: чи зможе інший об'єкт або кореневої об'єкт отримати його, і якщо так, то пам'ять, необхідна для цього об'єкта, зберігається.
Отже, як ми можемо дістатися до збірки сміття? (Розкажи мені! Розкажи мені!)

З метою збору сміття V8 ділить купу на дві частини: молоде і старе простір. Коли ви виконуєте операції, що вимагають виділення пам'яті, V8 виділяє місце в першій частині. Коли ви продовжуєте додавати речі в купу, ви в кінцевому підсумку вичерпує пам'ять, тому V8 буде запускати очистку. Для новостворених об'єктів пам'ять виділяється дуже швидко з короткою і швидкою колекції, що очищається на регулярній основі (для видалення вже мертвих об'єктів). Як тільки об'єкти «переживають» кілька (2, щоб бути точними) циклів очищення, вони переносяться в старе простір, обробляти складальником сміття в окремому циклі за фактом заповнення.

Старі об'єкти - це ті, які пережили більше одного циклу збірки сміття, тобто на них продовжують посилатися інші об'єкти, і вони повинні залишатися в пам'яті. Зазвичай вони не посилаються на молоді об'єкти, але продовжують мати посилання на більш старі об'єкти. Небажано допускати змішання поколінь, так як це робить прибирання менш чистою.
🆒 sources.js
Читайте нас наМедіуме, контрібьютьте наГітхабе, спілкуйтеся вгруппе Телеграма, стежте вТвіттереіканале Телеграма, скоро під'їде подкаст. Чи не губіться.