При составлении кодов на JavaScript во многих случаях умение управлять памятью не потребуются, потому что движок берет эти задачи на себя. Но если у вас возникнут проблемы с утечкой памяти, избавиться от них получится лишь после того, как вы разберетесь со всеми нюансами выделения памяти. Сегодня мы ознакомимся с руководством памятью, основами работы системы и научимся избегать утечки.
Начнём с жизненного цикла памяти
Работая над созданием функций, переменных и т.д., движок автоматически выделяет для них место, как только оно нам больше не потребуется. Выделение памяти - это сохранение места, а освобождение возвращает место в систему и позволяет это пространство использовать повторно.
Когда мы работаем над созданием функции, память имеет несколько этапов:
- Выделение. Выделение памяти. JavaScript выделяет необходимую память самостоятельно.
- Использование памяти. Это код который мы прописываем. То есть чтение и запись в память.
- Освобождение памяти. Это работа движка JavaScript. Когда освобождается память, ее можно использовать для других целей.
Следующий шаг стек и куча
Итак, мы уже разобрались, что движок JavaScript готовит память под вводимый код и очищает, когда эта память нам больше не потребуется. Где же тогда все хранится?
Здесь есть 2 варианта: хранение информации в стеке и куче, либо это структурные данные, используемые движком для различных потребностей.
Что такое стек?
Стек - это конструкция, применяемая для хранения информации объем которой мы знаем во время компиляции. JavaScript включает в себя (string, number, boolean, undefined и null) и ссылки на объекты. При этом объем данных не изменяется и движок определяет установленный размер каждому значению. При выделении установленного объема память этих значений имеет свой ограничения примитивных значений, а объем всего стека разнится зависимо от используемого браузера.
Что такое куча?
Куча - это система, которой пользуются для хранения функций и объектов. Движок не определяет нужный объем памяти, который будет необходим для разных объектов, а освобождает его лишь по необходимости.
Перейдем к ссылкам в JavaScript.
В стеке располагается ссылка на файлы из кучи без определенной последовательности, поэтому ссылка на необходимую память и хранится в стеке. Язык программирования сохраняет все файлы и функции в куче, а примитивные ссылки в стеке.
Следующий этап, сборка мусора
Теперь мы знаем как JavaScript работает с памятью для различных объектов, осталось поговорить о финальном этапе - освобождении. Все действия памяти определяет движок. Когда он видит непригодность функции, он сразу же освобождает выделенную память. Это является проблемой, так как возможности определится нужна нам эта память или нет больше не будет. То есть мы не можем создать алгоритм действий, который будет освобождать память только в случае если она действительно не нужна. Существуют лишь алгоритмы которые частично могут помочь в решении данной проблемы. Здесь нам необходимо знать как происходит сборка мусора с подсчетом ссылок и алгоритм пометок.
Сборка мусора является самым простым алгоритмом, так как он очищает все файлы, на которые не указывают никакие ссылки. Алгоритм пометок в свою очередь помогает определить как получить доступ к файлу через window или global. То есть алгоритм ставит пометки на недосягаемые объекты и убирает их, но их корневые файлы не удаляются.
В этой статье мы немного ознакомили вас с основными понятиями управления памятью в JavaScript. Изучив несколько принципов вы сможете работать с языком без каких либо проблем или утечек