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}}