Делаем полную сборку мусора из Javascript в Electron (Chrome/nodejs)

Я разрабатываю воксельный движок на 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? Очевидно, что меня не волнует кросс-браузерная поддержка, поэтому любые советы будут оценены.

JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
Раскрытие чувствительных данных
Раскрытие чувствительных данных
Все внешние компоненты, рассмотренные здесь до сих пор, взаимодействуют с клиентской стороной. Однако, если они подвергаются атаке, они не...
Зод: сила проверки и преобразования данных
Зод: сила проверки и преобразования данных
Сегодня я хочу познакомить вас с библиотекой Zod и раскрыть некоторые ее особенности, например, возможности валидации и трансформации данных, а также...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Руководство ChatGPT по продаже мини JS-файлов
Руководство ChatGPT по продаже мини JS-файлов
JS-файл - это файл, содержащий код JavaScript. JavaScript - это язык программирования, который в основном используется для добавления интерактивности...
2
0
867
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Оказывается, self.gc собирает мусор только в том потоке/воркере, из которого он был вызван. Запуск функции во всех моих рабочих процессах освободил столько же памяти, сколько и сборщик мусора инструментов разработчика.

Другие вопросы по теме