9 вещей, которые вам нужно знать об управлении памятью в JavaScript
Распределение памяти, сборка мусора и распространенные утечки памяти — это не то, что вы обычно читаете, когда дело доходит до изучения JavaScript.
Обычно это регулируется поиском Google, когда что-то идет не так.
Но распределение памяти в JavaScript важно. Это то, что заставляет ваше приложение работать и поддерживает его работу.
Без лишних слов, вот 12 кратких обзоров того, что вам нужно знать об управлении памятью в JavaScript и о том, как оно связано с распространенными утечками памяти.
1. Жизненный цикл памяти
- Все, что мы делаем в JavaScript, требует памяти.
Официальный язык JavScript говорит:
- Выделение памяти = резервирование места в памяти.
- Освобождение памяти = действие по освобождению места
- Слишком много выделяемой памяти и недостаточное количество освобождаемой памяти приводит к
OutOfMemory
ошибкам.
2. Стеки и кучи
- Память хранится в месте, называемом кучей памяти и стеком.
- Кучи и стеки — это разные типы структур данных.
Стек:
- используется для хранения статических данных.
- Статические данные — это когда размер данных известен во время компиляции.
- Вещи, размер которых мы точно знаем, — это примитивы, такие как строки, числа, логические значения, неопределенные значения и нули. Существует верхний предел того, насколько большими могут быть примитивы.
- Ссылки также считаются статическими данными. Почему? Потому что он указывает на объекты и функции (вроде адреса).
Куча:
- место, где хранятся объекты и функции.
- нет фиксированного распределения памяти.
- выделение пространства происходит по требованию — также известное как динамическое выделение памяти.
3. Сбор мусора
- сборка мусора - это процесс освобождения памяти
- это делает сборщик мусора 👆
- иногда сборщик мусора не знает, что вы закончили с памятью.
4. Автоматизированный сборщик мусора, метод 1: подсчет ссылок
- когда нет ссылок, указывающих на объект, сборщик мусора решает, что место в памяти больше не нужно.
- например: установить для объекта значение null.
null
👉 вещь объявлена, но ей ничего не назначено. Стоит 2 байта.undefined
👉 вещь не существует. Стоит 4 байта.- Установка значений в
null
не уменьшит выделение памяти, поскольку есть объекты, которые ссылаются друг на друга. Это называется циклическими ссылками. - Циклические ссылки создают зависимости — поэтому сборщик мусора не освобождает место в памяти.
Пример циклической ссылки:
let car = { name: "BMW" } let model = { name: "X5" } car.model = model; model.car = car; car = null; model = null;
5. Автоматизированный сборщик мусора, метод 2: алгоритмы маркировки и очистки
- mark and swap — это решение циклических зависимостей сборщиком мусора.
- Проверяет, доступен ли объект из корневого объекта.
- Корень в браузере =
window
- Корень в NodeJS =
global
- Если вы не можете добраться до него из корневого объекта, он помечается как мусор и обрабатывается зачисткой (т. е. сборкой).
- Корневой объект никогда не собирается.
6. Утечки памяти обычно глобальны
- ссылки на необъявленные объекты закрепляются на глобальном уровне.
eg.
function meow(){ speak = "meow"; }
Как это выглядит в реальности:
function meow(){ window.speak = "meow"; }
Теперь у нас есть случайная переменная window.speak
.
- исправление: правильно объявите свои переменные, чтобы они правильно определялись.
7. Таймеры и обратные вызовы обходятся дорого
setInterval
копипастинг из интернета не часто говорит о том, что его нужно удалить.- Так что он просто сидит там, делает что-то по таймеру или просто бездействует.
- Их называют оборванными таймерами. Ака. Они есть, но на самом деле больше не нужны.
- Исправление: избавьтесь от него с помощью
removeEventListener
после того, как закончите.
8. Ссылки вне DOM могут привести к утечке
- происходит, когда вы удаляете элементы DOM, но все еще имеете ссылки на них.
- Удаленные элементы DOM на самом деле не удаляются из памяти.
- См. циклические ссылки в #4 👆
9. Исправление ошибки «Недостаточно памяти» в JavaScript
- это ошибка Node.js
- Node.js использует эту ошибку, чтобы ваша программа не потребляла слишком много данных и не вызывала сценарий сбоя и записи.
Node.js memory limits based on versions: 9.11.2 => 1.35 GB 10.15.3 => 1.34 GB 11.15.0 => 1.34 GB 12.19.0 => 2.01 GB 13.14.0 => 2.01 GB 14.15.0 => 4.03 GB 15.0.1 => 4.03 GB
- вы можете увеличить значение по умолчанию 👆, но это только временное решение.
Исправление утечки памяти:
- удалите все ссылки на объекты, которые вам не нужны
- удалить таймеры и интервалы
- проверьте наличие случайных глобальных переменных или удалите ненужные глобальные переменные
Вот в основном и все, и я надеюсь, вам понравился этот быстрый стиль.
📌 <Free weekly code things, delivered every Sunday. /> + Monthly delivery of a Second Code Brain notebook + Exclusive code notes + Code recipes + Code philosophy and thoughts to build your general knowledge {{👉: Subscribe here}}