QUESTION: Що таке garbage collection?
Збирання сміття в JavaScript є механізмом автоматичного керування пам'яттю. Він повністю позбавляє програміста необхідності вручну виділяти і звільняти байти в оперативній пам'яті, як це робиться в низькорівневих мовах на кшталт C або C++.
Головним алгоритмом, який використовується сучасними рушіями для цих цілей, є алгоритм під назвою Mark-and-sweep, що в перекладі означає «помітка і очищення». Цей процес працює циклічно у фоновому режимі.
Збирач сміття починає обхід графа об'єктів від кореневих елементів, таких як об'єкт глобальної області видимості window або global, і позначає всі доступні та досяжні об'єкти як активні та потрібні. Усі ті сутності, до яких неможливо дійти за ланцюжком посилань від коренів, вважаються застарілими та видаляються з пам'яті.
Для тонкого налаштування роботи з пам'яттю та запобігання витокам у складних додатках розробники використовують спеціальні структури даних, такі як WeakMap і WeakSet. Вони зберігають слабкі посилання на об'єкти, що дозволяє гнучко керувати життєвим циклом даних.
Якщо на об'єкт у WeakMap більше немає інших сильних посилань у коді, він автоматично видаляється збирачем сміття, навіть попри те, що він присутній у цій карті. Важливо розуміти, що цей процес є повністю автоматизованим, і програміст не може примусово запустити його вручну з коду скрипта, хоча деякі середовища виконання і надають приховані прапорці для налагодження.