Garbage collection basics.

  • Сборка мусора — это механизм автоматического управления памятью.

  • Основная цель — освобождение памяти, занятой объектами, на которые больше нет ссылок.

  • JavaScript использует автоматическую сборку мусора для предотвращения утечек памяти.

Принцип работы

Удаление объектов происходит, когда на них не осталось ссылок с помощью алгоритма маркировки и сборки (Mark-and-Sweep) на основе достижимости объекта от корневых ссылок (root references).

Mark-and-Sweep

  • Сборщик мусора сначала маркирует (mark) все объекты, на которые есть ссылки:

начиная с корневых объектов (глобальные переменные, стек вызовов) обходятся все объекты, доступные из этих корней 

  • Затем он собирает (sweep) все недостижимые объекты, которые не были помечены, так как они больше не используются.

Объект считается "мёртвым", если на него нельзя добраться от корневых ссылок.

Даже если на объект есть ссылка от другого объекта, но весь этот "остров" объектов недостижим — он будет удалён.

GC запускается автоматически и по необходимости

  • Когда количество выделенной памяти превышает внутренний порог

  • При частом создании и удалении объектов

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

  • Может реагировать на резкий рост памяти или нестабильное поведение

 JavaScript не предоставляет API сборщика мусора напрямую, но язык предлагает несколько структур данных, которые косвенно наблюдают за сборкой мусора и могут быть использованы для управления использованием памяти:

  • WeakMap и WeakSet

  • WeakRef и FinalizationRegistry

WeakMap и WeakSet

  • Ключи (в WeakMap) и элементы (в WeakSet) хранятся слабо

  •  Если на объект больше нигде нет сильных ссылок — он удаляется сборщиком мусора

Эфемеры (ephemerons)

А если значение ссылается на ключ? Создаётся цикл.


 Чтобы это решить, используется особая модель хранения — ephemeron.  Записи WeakMap и WeakSet не являются настоящими ссылками (references)

  • GC сначала проверяет, достижим ли ключ

  • Если ключ достижим — сохраняется и значение

  • Если ключ недостижим — значение удаляется, даже если оно ссылается на ключ

WeakRef и FinalizationRegistry

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

WeakRef — слабая ссылка на объект

WeakRef — это механизм в JavaScript для слабой ссылки на объект. Это такая ссылка, которая не препятствует сборщику мусора при удалении объекта, если на него больше нет других сильных ссылок. WeakRef даёт возможность отслеживать, жив ли объект, но не гарантирует его существование. Подходит для необязательных кэшей и других менее критичных оптимизаций.

FinalizationRegistry 

Позволяет регистрировать объекты и получать уведомления, когда они удаляются сборщиком мусора. Это полезно для необходимости очистки после того, как объект больше не используется.

Иногда нужно выполнить очистку ресурсов после того, как объект был удалён сборщиком мусора, например:

  • Удаление объектов из кэша

  • Закрытие сетевых соединений или файлов

  • Очистка других внешних ресурсов

Как предотвратить утечки памяти?

Сборка мусора в JavaScript автоматизирует управление памятью, но важно:

  • Удалять ненужные ссылки на объекты.

  • Следить за замыканиями, которые могут удерживать ссылки на объекты в памяти.

Замыкания (Closures)

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

Сборка контекстов выполнения

  • Контексты выполнения создаются каждый раз, когда функция вызывается.

  • Когда функция завершается, ее execution context удаляется из стека вызовов.

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

  • Замыкания могут удерживать ссылку на переменные из внешней функции, даже если сама функция завершена. Execution context внешней функции не удаляется, так как его переменные все еще используются в замыкании.

Made with Slides.com