it-swarm.com.ru

Node.js куча нехватки памяти

Сегодня я запустил свой скрипт для индексации файловой системы, чтобы обновить индекс файлов RAID, и через 4 часа он вышел из строя со следующей ошибкой:

[md5:]  241613/241627 97.5%  
[md5:]  241614/241627 97.5%  
[md5:]  241625/241627 98.1%
Creating missing list... (79570 files missing)
Creating new files list... (241627 new files)

<--- Last few GCs --->

11629672 ms: Mark-sweep 1174.6 (1426.5) -> 1172.4 (1418.3) MB, 659.9 / 0 ms [allocation failure] [GC in old space requested].
11630371 ms: Mark-sweep 1172.4 (1418.3) -> 1172.4 (1411.3) MB, 698.9 / 0 ms [allocation failure] [GC in old space requested].
11631105 ms: Mark-sweep 1172.4 (1411.3) -> 1172.4 (1389.3) MB, 733.5 / 0 ms [last resort gc].
11631778 ms: Mark-sweep 1172.4 (1389.3) -> 1172.4 (1368.3) MB, 673.6 / 0 ms [last resort gc].


<--- JS stacktrace --->

==== JS stack trace =========================================

Security context: 0x3d1d329c9e59 <JS Object>
1: SparseJoinWithSeparatorJS(aka SparseJoinWithSeparatorJS) [native array.js:~84] [pc=0x3629ef689ad0] (this=0x3d1d32904189 <undefined>,w=0x2b690ce91071 <JS Array[241627]>,L=241627,M=0x3d1d329b4a11 <JS Function ConvertToString (SharedFunctionInfo 0x3d1d3294ef79)>,N=0x7c953bf4d49 <String[4]\: ,\n  >)
2: Join(aka Join) [native array.js:143] [pc=0x3629ef616696] (this=0x3d1d32904189 <undefin...

FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory
 1: node::Abort() [/usr/bin/node]
 2: 0xe2c5fc [/usr/bin/node]
 3: v8::Utils::ReportApiFailure(char const*, char const*) [/usr/bin/node]
 4: v8::internal::V8::FatalProcessOutOfMemory(char const*, bool) [/usr/bin/node]
 5: v8::internal::Factory::NewRawTwoByteString(int, v8::internal::PretenureFlag) [/usr/bin/node]
 6: v8::internal::Runtime_SparseJoinWithSeparator(int, v8::internal::Object**, v8::internal::Isolate*) [/usr/bin/node]
 7: 0x3629ef50961b

Сервер оснащен 16 ГБ RAM и 24 ГБ подкачки SSD. Я сильно сомневаюсь, что мой сценарий превысил 36 ГБ памяти. По крайней мере, это не должно

Скрипт создает индекс файлов, хранящихся в виде массива объектов, с метаданными файлов (даты изменения, разрешения и т.д., Без больших данных)

Вот полный код скрипта: http://Pastebin.com/mjaD76c3

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

119
Lapsio

Если я правильно помню, существует строгий стандартный предел использования памяти в V8 около 1,7 ГБ, если вы не увеличиваете его вручную. 

В одном из наших продуктов мы использовали это решение в нашем сценарии развертывания:

 node --max-old-space-size=4096 yourFile.js

Также будет новая команда пробела, но, как я читал здесь: a-tour-of-v8-garbage-collection новое пространство собирает только недавно созданные краткосрочные данные, а старое пространство содержит все ссылочные структуры данных который должен быть в вашем случае лучшим вариантом.

170
Felix

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

Вы можете добавить его в свойство runtimeArgs вашей конфигурации в launch.json

Смотрите пример ниже. 

{
"version": "0.2.0",
"configurations": [{
        "type": "node",
        "request": "launch",
        "name": "Launch Program",
        "program": "${workspaceRoot}\\server.js"
    },
    {
        "type": "node",
        "request": "launch",
        "name": "Launch Training Script",
        "program": "${workspaceRoot}\\training-script.js",
        "runtimeArgs": [
            "--max-old-space-size=4096"
        ]
    }
]}
19
Astr-o

На всякий случай, если кто-то столкнется с этим в среде, где он не может установить свойства узла напрямую (в моем случае это инструмент сборки):

NODE_OPTIONS="--max-old-space-size=4096" node ...

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

15
Kamiel Wanrooij

я боролся с этим даже после установки --max-old-space-size. 

Тогда я понял, что нужно поставить опции --max-old-space-size перед сценарием кармы.

также лучше всего указать оба синтаксиса --max-old-space-size и --max_old_space_size мой скрипт для кармы: 

node --max-old-space-size=8192 --optimize-for-size --max-executable-size=8192  --max_old_space_size=8192 --optimize_for_size --max_executable_size=8192 node_modules/karma/bin/karma start --single-run --max_new_space_size=8192   --prod --aot

ссылка https://github.com/angular/angular-cli/issues/1652

10
duchuy

fwiw, может помочь поиск и исправление проблемы с памятью с помощью чего-то вроде memwatch .

9
NathanQ

Если вы хотите увеличить использование памяти узла глобально, а не только одним скриптом, вы можете экспортировать переменную среды, например:
export NODE_OPTIONS=--max_old_space_size=4096

Тогда вам не нужно играть с файлами при запуске таких сборок, как npm run build.

8
Maksim Luzik

У меня была похожая проблема при выполнении угловых сборок AOT. Следующие команды помогли мне.

npm install -g increase-memory-limit
increase-memory-limit

Источник: https://geeklearning.io/angular-aot-webpack-memory-trick/

6
Chandru

Шаги, чтобы исправить -

  1. Откройте командную строку и введите %appdata% нажмите enter 
  2. Перейдите к папке %appdata%> npm
  3. Откройте или отредактируйте ng.cmd в вашем любимом редакторе
  4. Добавьте --max_old_space_size=8192 в блок IF и ELSE

Ваш файл node.cmd выглядит после изменения:

@IF EXIST "%~dp0\node.exe" (
  "%~dp0\node.exe" "--max_old_space_size=8192" "%~dp0\node_modules\@angular\cli\bin\ng" %*
) ELSE (
  @SETLOCAL
  @SET PATHEXT=%PATHEXT:;.JS;=;%
  node "--max_old_space_size=8192" "%~dp0\node_modules\@angular\cli\bin\ng" %*
)
4
Umang Patwa

Вот некоторые значения флага, чтобы добавить дополнительную информацию о том, как выделить больше памяти при запуске сервера вашего узла. 

1 ГБ - 8 ГБ

#increase to 1gb
node --max-old-space-size=1024 index.js

#increase to 2gb
node --max-old-space-size=2048 index.js 

#increase to 3gb
node --max-old-space-size=3072 index.js

#increase to 4gb
node --max-old-space-size=4096 index.js

#increase to 5gb
node --max-old-space-size=5120 index.js

#increase to 6gb
node --max-old-space-size=6144 index.js

#increase to 7gb
node --max-old-space-size=7168 index.js

#increase to 8gb 
node --max-old-space-size=8192 index.js 

2
Nicholas

просто увеличьте объем памяти кучи с 1 до 8 ГБ для windows open powershell или cmd в каталоге вашего проекта и введите следующую команду: для mac открыть терминал в этом каталоге 

node --max-old-space-size={size in MBs} index.js
1
Basit Raza

Обновите узел до последней версии. Я был на узле 6.6 с этой ошибкой и обновился до 8.9.4, и проблема ушла.

1
Richard Frank

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

0
Adrien Joly

Я пытался ???? код ниже и работает нормально.

  • открыть терминал из корневого каталога проекта
  • выполнить cmd, чтобы установить новый размер.

    set NODE_OPTIONS = - max_old_space_size = 8172

Или вы можете проверить ссылку для получения дополнительной информации https://github.com/nodejs/node/issues/10137#issuecomment-487255987

0
rkumar1904

В моем случае я запускал npm install на предыдущей версии узла, через некоторое время я обновил версию узла и ram npm install для нескольких модулей. После этого я получил эту ошибку. Чтобы решить эту проблему, я удалил папку node_module из каждого проекта и снова запустил npm install.

Надеюсь, что это может решить проблему.

Примечание: это происходило на моей локальной машине, и это было исправлено только на локальной машине.

0
Gampesh

Если вы пытаетесь запустить не сам node, а какой-то другой софт, например, webpack, вы можете использовать переменную окружения и пакет cross-env:

$ cross-env NODE_OPTIONS='--max-old-space-size=4096' \
  webpack --progress --config build/webpack.config.dev.js
0
Piterden