Куда уходит выделенная память, чтобы умереть?

Я плохо умею сводить концы с концами, это просто факт. Иногда я забываю о замыканиях, я никогда не заканчивал «Безумцев», и я уверен, что оставил глобальную переменную, плавающую где-то в космосе. К счастью для меня, я изучаю язык с низкоуровневыми примитивами управления, такими как malloc() и free() (отсосите C!). Я пошел по большой дороге и выучил Javascript, в котором есть эта удобная общественная служба, о которой вы, возможно, знаете из своей повседневной жизни: скромный сборщик мусора.

Жизненный цикл памяти выглядит так

  • Выделить — ОС выделяет память для использования вашей программой.
  • Использование — здесь происходит чтение и запись.
  • Освобождение — память снова становится свободной и доступной.

Компилятор проверяет примитивные типы данных и вычисляет, сколько памяти им потребуется. Необходимая сумма называется пространством стека. Когда функции вызываются, память добавляется к верхней части существующей памяти, а по мере их завершения они удаляются в порядке LIFO (последним пришел — первым вышел).

При этом большинство сборщиков мусора работают, собирая память, к которой нет доступа.

Один пример: все переменные, указывающие на него, вышли из области видимости.

Это все вопрос справки.

  • Объект может ссылаться на другой объект, если первый имеет доступ ко второму (неявно или явно).
  • В JS объекты (в этом сценарии объекты относятся ко всем объектам и функциям) могут ссылаться на свой прототип (неявный) и значения его свойств (явный).

Проверьте это — ›

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

Теперь в качестве домашнего задания поищите алгоритм Mark and Sweep. Или просто настройтесь в следующий раз.