Я разрабатываю воксельный движок на Javascript с использованием Threejs и столкнулся с некоторыми проблемами использования памяти. Предполагаемая среда находится в приложении Electron, что означает, что я могу запустить программу с флагами (--expose-gc
), которые включают ручную сборку мусора с помощью gc().
Я заметил, что при запуске функции gc() освобождается гораздо меньше памяти по сравнению с тем, когда я нажимал кнопку «собрать мусор» в разделе «Память» инструментов разработчика Chrome. Например, если программа изначально использовала 2000 МБ памяти, после gc() она освободит до 300 МБ, но после нажатия вышеупомянутой кнопки освободится еще до 600 МБ, что составит примерно половину того, что было изначально. .
Немного покопавшись, я также узнал о флаге --gc-global
. Это было бы идеально, так как он вел себя так же, как ручной сборщик мусора, но запускался несколько раз в секунду, из-за чего моя программа сильно тормозила. Я пытался контролировать скорость сбора мусора с помощью --gc-interval
, но это никак не повлияло на него.
Я также нашел этот ответ, в котором говорилось о ProfilerAgent.collectGarbage();
, но он всегда выдавал ошибку ссылки. Кроме того, предоставленный им флаг (--debug-devtools-frontend
) не распознавался Chrome. Это, а также тот факт, что я смог найти очень мало информации об этом помимо ответа, заставили меня поверить, что это устаревшая функция.
Я также профилировал использование памяти с помощью инструментов разработчика, и, что удивительно, оно было намного ниже по сравнению со значением, которое показал мне диспетчер задач: похоже, на него не повлияла утечка памяти. Это сделало практически невозможным определение места утечки памяти.
Я также должен прояснить, что, хотя Chrome выполняет сборку мусора самостоятельно, это происходит слишком редко, и он редко выполняет полную сборку мусора, а это означает, что использование памяти примерно в два раза превышает то, что могло бы быть.
Таким образом, есть ли способ запустить полную сборку мусора из Chrome или nodejs/Electron? Очевидно, что меня не волнует кросс-браузерная поддержка, поэтому любые советы будут оценены.
Оказывается, self.gc
собирает мусор только в том потоке/воркере, из которого он был вызван. Запуск функции во всех моих рабочих процессах освободил столько же памяти, сколько и сборщик мусора инструментов разработчика.