Очищаются ли глобальные переменные сборщиком мусора в Node? - PullRequest
0 голосов
/ 15 июня 2019

В следующем JS-коде сборщик мусора будет очищать example1 или example2? Будет ли их память когда-либо выпущена GC? Я имею дело с утечками памяти, и у меня есть несколько таких случаев в моем коде.

example1 = 'Outside a function'

function sample(x){
    example2 = 'Inside a function'
}
sample(1)

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

1 Ответ

1 голос
/ 15 июня 2019

Куча состоит из двух основных сегментов, нового пространства и старого пространства. Новое пространство - это место, где происходят новые распределения; Здесь можно быстро собирать мусор, и его размер составляет ~ 1-8 МБ. Объекты, живущие в Новом Пространстве, называются Молодым Поколением. Старое Пространство, где продвигаются объекты, которые выжили в коллекционере в Новом Пространстве - они называются Старым Поколением. Распределение в старом пространстве быстрое, однако сбор дорогой, поэтому он выполняется редко.

Вы должны понимать, что мало кто думает, например:

1 - Сборщик мусора строит список «корней». Корни обычно являются глобальными переменными, ссылки на которые хранятся в коде. В JavaScript объект «окно» является примером глобальной переменной, которая может выступать в роли корня. Объект window всегда присутствует, поэтому сборщик мусора может считать его и все его дочерние элементы всегда присутствующими (т.е. не мусором).

2 - Все корни проверяются и помечаются как активные (т.е. не мусор). Все дети также проверяются рекурсивно. Все, что может быть достигнуто из корня, не считается мусором.

3 - Все фрагменты памяти, не помеченные как активные, теперь можно считать мусором. Сборщик теперь может освободить эту память и вернуть ее в ОС.

Итак, о ваших вопросах:

From what I understand is neither of the variables will ever be cleaned by Garbage collector because they are treated as global variables. 
Might sound like a trivial question but finding memory leaks is like finding a needle in a haystack

Вы правы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...