Может ли сборка мусора происходить, когда основной поток занят? - PullRequest
0 голосов
/ 10 октября 2018

Допустим, у меня есть длительный цикл:

// Let's say this loop takes 10 seconds to execute
for(let i = 0; i <= 1000000; ++i) {
    const garbage = { i };
    // some other code
}

Может ли сборщик мусора работать во время цикла или он может работать только при простое приложения?

Я не сделалЯ не могу найти какую-либо документацию, связанную с этим, но поскольку Node.js имеет --nouse-idle-notification, который теоретически отключает GC, я думаю, что GC запускается только тогда, когда отправлено уведомление о простое (когда основной поток не занят).

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

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

V8 разработчик здесь.Краткий ответ: GC может работать в любое время и запускаться в любое время.

Обратите внимание, что сборщик мусора представляет собой довольно сложную систему: он выполняет несколько различных задач и выполняет большинство из них поэтапно и / или одновременно с основным потоком.В частности, каждое распределение может инициировать небольшую добавочную работу GC.(Это подразумевает, что, очень тщательно избегая всех распределений, вы можете создавать циклы, которые не будут вызывать активность GC во время их работы; но никогда не бывает, что циклы накапливают мусор, который не может быть собран - если у вас нет утечки в вашемкод, конечно, где объекты непреднамеренно остаются достижимыми.)

Может ли сборщик мусора работать во время цикла или он может работать только в режиме ожидания приложения?

Он абсолютно может и будет работать во время цикла.

Node.js имеет --nouse-idle-Уведомление, которое теоретически отключает GC

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

GC запускается только тогда, когда отправлено уведомление о бездействии (когда основной поток незанятости)

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

мой цикл иногда имеет всплески времени выполнения и хочет знать, возможно ли, что GC может работать во время цикла, что приводит к скачку задержки

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

, если для переменной задано значение null - сборка мусора выполняется немедленно

Нет, это не так.Сборка мусора никогда не выполняется немедленно (по крайней мере, в V8).

0 голосов
/ 10 октября 2018

В качестве концепции сборщик мусора работает в отдельном потоке, поскольку таким образом он не будет блокировать основной поток (поток пользовательского интерфейса в большинстве случаев).

Как и в вашем примере, для проблем нетпоток сборки мусора, работающий "параллельно" с этим циклом, так как значение const garbage = {key: i} не будет удалено, пока оно ссылается .

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

...