08. Функции. Часть 2. Замыкания

Сборка мусора

В программировании сборка мусора (устоявшийся термин, с точки зрения русского языка правильнее «сбор мусора», англ. garbage collection, GC) — одна из форм автоматического управления памятью. Специальный код, называемый сборщиком мусора (garbage collector), периодически освобождает память, удаляя объекты, которые уже не будут востребованы приложением — то есть производит сборку мусора.

Цитата из Википедии

Посмотрите на следующий код:


var x = {s:"лиса"};

Много раз мы анализировали работу подобного кода по шагам:

  1. Создаётся переменная с именем x (ячейка фиксированной длины в памяти)
  2. Где-то в памяти создаётся объект {s:"лиса"}
  3. Ссылка на созданный объект помещается в переменную x

Все ясно, правда?

А теперь, следом за первой строкой кода запишем вторую:


x = 1;

Здесь тоже все понятно: число 1 записывается в переменную x (в ту ячейку памяти фиксированной длины, которая отведена под x).

А что случилось со ссылкой на объект? Понятно, что. Она пропала, затерлась единицей. А что случилось с самим объектом?

Предположим, что объект остался в памяти. Но этот объект — явный мусор: нет переменных, которые на него ссылаются, значит, к нему никак нельзя обратиться из программы.

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

Конечно, мусор надо убирать. За чистотой в доме следит сборщик мусора — составная часть интерпретатора JavaScript.

Область памяти Ссылки
   

У сборщика мусора есть «журнал» учета памяти.

Область памяти Ссылки
{s:"лиса"} x

Вид журнала (условно) после выполнения первой строки:


var x = {s:"лиса"};
Область памяти Ссылки
{s:"лиса"} нет ссылок

Вид журнала (условно) после выполнения второй строки:


x = 1;

Сборщик мусора, просматривая журнал, обнаружит, что на область памяти, отведенную под объект {s:"лиса"}, нет ни одной ссылки. Объект будет уничтожен, свободная память пополнится. Сборщик мусора отложит метлу и выпьет стакан чаю.

А теперь посмотрите на следующий код:


var x = {s:"лиса"};
var y = x;
x = 1;

Есть работа для сборщика мусора? Нет, он отдыхает. В самом деле, посмотрим, как заполняется журнал учета памяти.


var x = {s:"лиса"};

После первой команды:

Область памяти Ссылки
{s:"лиса"} x

var y = x;

После второй команды:

Область памяти Ссылки
{s:"лиса"} x, y

var y = x;

После третьей команды:

Область памяти Ссылки
{s:"лиса"} y

Объект не уничтожен, так как на него ссылается переменная y (переменная x ссылаться перестала). С такой ситуацией мы уже сталкивались: смотрите комментарий к решению задания 3 из заметки 7.