Мы знаем, что такое фигня. По сути, мусор относится к вещам, которые больше не используются. Когда дело доходит до программирования, сборка мусора означает очистку пространств памяти, которые не содержат полезных данных, а затем перераспределение этой очищенной памяти для некоторых других данных, которые являются как активными, так и полезными. Это основной процесс сборки мусора практически во всех языках программирования в мире. Некоторые языки программирования требуют явного вмешательства разработчика, в то время как другие языки делают это автоматически. Язык программирования низкого уровня, такой как C, требует от разработчика освобождения памяти с помощью таких методов, как malloc () и free (), когда программе больше не нужны эти переменные или объекты. Освобождение памяти и объектов является прерогативой разработчика. мяч находится в поле зрения разработчика, чтобы решить, освобождать его или нет. Но это не всегда так. Для языков программирования высокого уровня, таких как JavaScript,
процесс управления памятью автоматизирован. Об этом позаботится браузер.

В этом разделе мы увидим следующее содержание.

  1. Жизненный цикл управления памятью
  2. Алгоритмы сборки мусора
  3. Подводные камни для утечки памяти

Давайте теперь посмотрим на общий жизненный цикл управления памятью, чтобы лучше понять процесс.

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

Последний шаг называется механизмом сборки мусора. Это автоматизированный процесс в JavaScript, и этот процесс выполняется сущностью, называемой сборщиком мусора, хотя мы не можем физически найти этот агент в движке браузера. Задача сборщика мусора - отслеживать выделение памяти и определять, нужна ли больше конкретная память. Если он не нужен, он восстанавливает память. Но механизм сборки мусора всегда является приблизительным, так как полезность конкретного блока выделенной памяти не поддается определению.

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

  1. Алгоритм подсчета ссылок
  2. Алгоритм Mark and Sweep

Давайте попробуем разобраться в них по очереди.

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

var obj = { // first object created 
 property1: { // second object created
 property2 : 10
 }
}

Здесь создаются два объекта, и на один ссылается свойство другого объекта. Другой объект, на который имеется ссылка, назначается переменной obj. Поскольку есть ссылки, сборка мусора отсутствует.

var newObj = obj; // Now we have another to the existing objects.
obj = 10; // Still the objects are referenced by the newObj variable. So there is no chance of GC

Давайте посмотрим на другую реализацию.

var anotherObj = newObj.property1;

Теперь на объект property1 есть две ссылки. Один как свойство переменной newObj, а другой - из переменной anotherObj. Так что это не может быть собранным мусором.

newObj = ‘Some string’;

Теперь объект, созданный в переменной obj, как таковой имеет нулевую ссылку. Но по-прежнему на его свойство1 ссылается переменная anotherObj. Так что это не может быть
сборщик мусора.

anotherObj = null;

Теперь у нас нет ни одной ссылки на объект property1 из любого места. В этой ситуации объекты могут быть удалены сборщиком мусора.

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

function foo() {
   var obj1 = {};
   var obj2 = {}; 
   obj1.a = obj2; 
   obj2.a = obj1;
   console.log(obj1);
   console.log(obj2);
}
foo();

Просто пройдитесь по объектам вывода. Вы можете видеть вложенные свойства? Это что-то известное как Циркулярная ссылка. В этом случае алгоритм подсчета ссылок терпит неудачу, поскольку все вложенные объекты ссылаются друг на друга. Таким образом, нет возможности сборки мусора с использованием этого алгоритма. Это приводит нас к нашему следующему алгоритму, то есть алгоритму метки и сканирования.

Алгоритм Mark and Sweep
Алгоритм Mark and Sweep реализует механизм GC посредством обращения к объектам. Если объект недоступен, он воспринимается как мусор и собирается. Алгоритм следует принципу, что если объект имеет нулевые ссылки, то он фактически недоступен. Таким образом, он может быть мусором.
Процесс идентифицирует корневой объект, то есть объект окна, и оттуда он переходит ко всем другим дочерним объектам, а затем к дочерним объектам дочерних объектов. Если есть объекты, которые не могут быть достигнуты в этом процессе, они собираются как мусор, а память освобождается. Этот алгоритм эффективно решает проблему эталонного цикла, которую мы видели в алгоритме подсчета ссылок.

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

  1. Чрезмерное использование глобальных переменных путем создания глобальных переменных или исключения ключевого слова var в локальной области видимости
  2. Забыть об очистке таймеров вроде setInterval ()
  3. Ненужное использование замыканий (замыкания всегда сохраняют ссылку на переменные из родительской функции, даже если родительская функция завершила выполнение).

Поэтому мы всегда должны избегать вышеуказанных ошибок.

Это был краткий обзор процесса сборки мусора в JavaScript. Тема очень обширна, но это может быть отправной точкой для дальнейшего накопления знаний.