Nodejs уменьшает использование памяти коллектора мусора v8 - программирование

Nodejs уменьшает использование памяти коллектора мусора v8

Я отлаживаю приложение nodejs с util, а значение heapUsed остается около 30- 100 МБ, значение heapTotal выросло до 1,4 ГБ.

Вот вопрос о аналогичном поведении

Я читал, что это так, как ведет себя сборщик мусора v8, но вопрос в том, как уменьшить объем выделенной памяти (сделать его менее 1,4 ГБ), если он работает на устройстве с 512 МБ, например

4b9b3361

Ответ 1

Вам нужно контролировать флаги максимального размера памяти (все размеры берутся в МБ).

рекомендуемые суммы для "устройства с низкой памятью" :

node --max-executable-size=96 --max-old-space-size=128 --max-semi-space-size=1 app.js

для 32-разрядных и/или Android и

node --max-executable-size=192 --max-old-space-size=256 --max-semi-space-size=2 app.js

для 64-битного не-андроида.

Это ограничило бы общую сумму кучи до 225 мб и 450 мб соответственно. Он не включает использование памяти вне JS. Например, буферы распределяются как "c memory", а не в куче JavaScript.

Также вы должны знать, что чем ближе вы к пределу кучи, тем больше времени тратится в GC. Например. если вы используете 95% использования памяти, 90% CPU будет использоваться для GC и 10% для запуска реального кода (а не реальных чисел, но дать общую идею). Поэтому вы должны быть настолько щедрыми, насколько это возможно, с ограничениями и никогда не превышайте, например, 16% максимального использования памяти (I.E. heapUsed/limit не должно превышать 0.16). 16% - это то, что я вспоминаю из какой-то статьи, это может быть не самый оптимальный.

Флаги:

  • --max-executable-size максимальный размер кучи, зарезервированный для исполняемого кода (результат нативного кода скомпилированного JavaScript).
  • --max-old-space-size максимальный размер кучи, зарезервированный для долгосрочных объектов
  • --max-semi-space-size максимальный размер кучи зарезервирован для краткосрочных объектов