Подтвердить что ты не робот

Node.js куча из памяти

Сегодня я запустил мой script для индексации файловой системы, чтобы обновить индекс файлов 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-гигабайтной оперативной памятью и 24-гигабайтным сводом SSD. Я очень сомневаюсь, что мой script превысил 36 гб памяти. По крайней мере, это не должно быть

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

Здесь полный код script: http://pastebin.com/mjaD76c3

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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

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

Ответ 3

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

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

Ответ 4

Я столкнулся с этой проблемой при попытке отладки с 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"
        ]
    }
]}

Ответ 5

я боролся с этим даже после установки --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

Ответ 6

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

Ответ 7

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

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 

Ответ 8

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

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

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

Ответ 9

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

  1. Откройте командную строку и введите %appdata% нажмите ввод
  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" %*
)

Ответ 10

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

Ответ 11

Я недавно столкнулся с этой же проблемой и столкнулся с этой темой, но моя проблема была с React App. Приведенные ниже изменения в команде запуска узла решили мои проблемы.

Синтаксис

node --max-old-space-size=<size> path-to/fileName.js
Пример

Example

node --max-old-space-size=16000 scripts/build.js

Почему размер 16000 в максимальном размере старого пространства?

Как правило, это зависит от того, какая память выделена для этого потока, и от настроек вашего узла.

Как проверить и указать правильный размер?

Это в основном остается в нашем двигателе v8. приведенный ниже код поможет вам понять размер кучи вашего локального узла v8.

const v8 = require('v8');
const totalHeapSize = v8.getHeapStatistics().total_available_size;
const totalHeapSizeGb = (totalHeapSize / 1024 / 1024 / 1024).toFixed(2);
console.log('totalHeapSizeGb: ', totalHeapSizeGb);

Ответ 12

Можно использовать следующую переменную среды:

NODE_OPTIONS= --max-old-space-size=8192 .

Еще одно примечание: console.log() также потребляет память в терминале.

только что попытался прокомментировать console.log() на терминале. потому что это также займет память.

Ответ 13

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

variable name = NODE_OPTIONS
variable value = --max-old-space-size=4096

Ответ 14

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

Ответ 15

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

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

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

Ответ 16

Я попробовал "приведенный ниже код и он работает нормально".

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

    установить NODE_OPTIONS = --max_old_space_size = 8172

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

Ответ 17

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

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

Ответ 18

Попробуйте выполнить эту команду:

npm rebuild grpc

Ответ 19

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

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

Ответ 20

Для связывания angular проектов я добавил следующую строку в мой файл pakage.json в разделе сценарии.

"build-prod": "node --max_old_space_size=5120 ./node_modules/@angular/cli/bin/ng build --prod --base-href /"

Теперь, чтобы связать мой код, я использую npm run build-prod вместо ng build --requiredFlagsHere

надеюсь это поможет!