Многие говорят об управлении памятью в JS. Но большая часть этого делается автоматически.

Как только мы создадим переменные и объявим функции, все, что потребляет память, в какой-то момент должно быть освобождено (не нами).

Большой вопрос заключается в том, как JS это очищает?

Одним из основных способов отслеживания выделенной памяти в JS является Reachability.

Что это значит? Что ж, «достижимые» значения — это те, к которым можно получить доступ тем или иным образом.

  1. Существует базовый набор значений, которые нельзя удалить, например:
  • Глобальные переменные
  • Текущие исполняемые функции.
  • Любые другие функции, находящиеся в цепочке выполнения, их локальные переменные и любые другие параметры.

2. Любое другое значение считается достижимым, если оно достижимо из корня по ссылке или по цепочке ссылок.

  • Если у вас есть глобальный объект, и свойство этого объекта является другим объектом и т. д. и т. д., то все они достижимы и, следовательно, остаются в памяти.
  • Глобальный объект обычно рассматривается как корень, из которого просматриваются ссылки, и алгоритм маркировки и очистки запускается через этот корень, чтобы определить надежность объекты или функции.

Мы можем использовать структуры данных, чтобы помочь нам пометить данные, к которым мы неявно хотим, чтобы сборщик мусора относился более агрессивно.

Что ??? Структуры данных в JS?? Ты сошел с ума братан?

Да :0

У нас есть несколько структураторов данных, таких как WeakMap и WeakSet, они работают почти так же, как их близкие родственники Map и Set, но с одной оговоркой.

WeakMap и WeakSet получили свои названия из-за того, что если у них есть данные, которые слабо удерживаются, что означает, что никто не удерживает данные сильно, что означает прямую ссылку, тогда алгоритм GC может просто пометить ключ/значение как недостижимый и освободить память следующего цикла алгоритма.

Все другие структуры данных, доступные в JS, строго удерживаются, что означает, что они не будут помечены для такой быстрой очистки.

Одно незначительное отличие от обычных Map и Set состоит в том, что это два правила, которые управляют GC в WeakMap/WeakSet, а именно:

  1. Может хранить только объекты, так как примитивные значения не будут собираться из структуры.
  2. Они не являются итерируемыми. Другими словами, мы не можем использовать Array.from(map.keys()).length для поиска длины, поскольку это мешает всей концепции GC, мы не можем удалить то, на что ссылаются.

Если обобщить все, что мы прошли, то это может быть все, кроме 4 пунктов:

  1. Сбор мусора выполняется автоматически. Мы не можем заставить или предотвратить это.
  2. Объекты остаются в памяти, пока они доступны.
  3. Быть упомянутым не то же самое, что быть доступным. Пакет взаимосвязанных объектов может стать недостижимым в целом.
  4. Мы можем попытаться оптимизировать управление памятью, используя соответствующие структуры данных и продуманные программные структуры.