Куда уходит выделенная память, чтобы умереть?
Я плохо умею сводить концы с концами, это просто факт. Иногда я забываю о замыканиях, я никогда не заканчивал «Безумцев», и я уверен, что оставил глобальную переменную, плавающую где-то в космосе. К счастью для меня, я изучаю язык с низкоуровневыми примитивами управления, такими как malloc() и free() (отсосите C!). Я пошел по большой дороге и выучил Javascript, в котором есть эта удобная общественная служба, о которой вы, возможно, знаете из своей повседневной жизни: скромный сборщик мусора.
Жизненный цикл памяти выглядит так
- Выделить — ОС выделяет память для использования вашей программой.
- Использование — здесь происходит чтение и запись.
- Освобождение — память снова становится свободной и доступной.
Компилятор проверяет примитивные типы данных и вычисляет, сколько памяти им потребуется. Необходимая сумма называется пространством стека. Когда функции вызываются, память добавляется к верхней части существующей памяти, а по мере их завершения они удаляются в порядке LIFO (последним пришел — первым вышел).
При этом большинство сборщиков мусора работают, собирая память, к которой нет доступа.
Один пример: все переменные, указывающие на него, вышли из области видимости.
Это все вопрос справки.
- Объект может ссылаться на другой объект, если первый имеет доступ ко второму (неявно или явно).
- В JS объекты (в этом сценарии объекты относятся ко всем объектам и функциям) могут ссылаться на свой прототип (неявный) и значения его свойств (явный).
Проверьте это — ›
Это может привести к некоторым порочным «циклам», если вы не будете осторожны, потому что некоторые объекты могут выходить за рамки, но по-прежнему ссылаться друг на друга, и это небольшая опасность, которую мы можем устранить в будущем.
Теперь в качестве домашнего задания поищите алгоритм Mark and Sweep. Или просто настройтесь в следующий раз.