FATAL ERROR: CALL_AND_RETRY_LAST Не удалось выполнить выделение - процесс из памяти

Node версия v0.11.13

Использование памяти во время сбоя в соответствии с sudo top не поднимается над 3%

Код, который воспроизводит эту ошибку:

var request = require('request')
var nodedump = require('nodedump')

request.get("http://pubapi.cryptsy.com/api.php?method=marketdatav2",function(err,res)
{
    var data
    console.log( "Data received." );
    data = JSON.parse(res.body)
    console.log( "Data parsed."   );
    data = nodedump.dump(data)
    console.log( "Data dumped."   ); 
    console.log( data )
})

Чтобы проверить, была ли проблема с размером стека рекурсии, я выполнил следующий код с параметром -stack-size = 60000

var depth = 0;

(function recurse() {
    // log at every 500 calls
    (++depth % 500) || console.log(depth);
    recurse();
})();

и получили

264500 
Segmentation fault

Затем я запустил код, который дает мне FATAL ERROR: CALL_AND_RETRY_LAST Не удалось выполнить выделение - обработать из памяти тот же параметр -stack-size = 60000 и не получить Segmentation fault.

Итак, я заключу, что CALL_AND_RETRY_LAST не имеет ничего общего с размером стека рекурсии.

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

Есть аналогичные вопросы о stackoverflow, но ни один из этих вопросов не касается CALL_AND_RETRY_LAST, поэтому я создал отдельный вопрос.

Ответ 1

Если вы посмотрите на источник: github/v8, кажется, что вы пытаетесь зарезервировать один очень большой объект? Мой опыт показывает, что это происходит, если вы пытаетесь проанализировать огромный объект JSON, но когда я пытаюсь проанализировать ваш вывод с помощью JSON и node0.11.13, он просто работает нормально.

Вам не нужно больше --stack-size, вам нужно больше памяти: --max_new_space_size и/или --max_old_space_size.

Единственный совет, который я могу вам дать: попробуйте другой JSON-парсер и/или попробуйте изменить формат ввода на строку JSON вместо только JSON.

Ответ 2

Чтобы решить эту проблему, вам нужно запустить приложение, увеличив ограничение памяти с помощью опции --max_old_space_size. По умолчанию предел памяти Node.js равен 512 МБ.

node --max_old_space_size=2000  server.js 

Ответ 3

$ sudo npm install -g increase-memory-limit

Запустите из корневого каталога вашего проекта:

$ increase-memory-limit

Этот инструмент добавит --max-old-space-size = 4096 во все вызовы узлов в ваших файлах node_modules/.bin/*.


Node.js версия> = 8 - УВЕДОМЛЕНИЕ ОБ УСТРАНЕНИИ

Начиная с NodeJs V8.0.0, можно использовать опцию --max-old-space-size. NODE_OPTIONS = варианты...

$ export NODE_OPTIONS=--max_old_space_size=4096

Ответ 4

Я обнаружил, что max_new_space_size не является опцией в узле 4.1.1, и только max_old_space_size не решил мою проблему. Я добавляю следующее к своему шебангу, и комбинация из них, кажется, работает:

#!/usr/bin/env node --max_old_space_size=4096 --optimize_for_size --max_executable_size=4096 --stack_size=4096

[РЕДАКТИРОВАТЬ]: 4096 === 4 ГБ памяти, если на вашем устройстве недостаточно памяти, вы можете выбрать меньшее количество.

[ОБНОВЛЕНИЕ]: Также обнаружил эту ошибку при запуске grunt, который ранее запускался так:

./node_modules/.bin/grunt

После обновления команды до следующей она перестала иметь ошибки памяти:

node --max_old_space_size=2048 ./node_modules/.bin/grunt 

Ответ 5

Примечание: см. Предупреждение в комментариях о том, как это может повлиять на приложения Electron.

Начиная с версии 8.0, выпущенной в августе 2017 года, переменная среды NODE_OPTIONS предоставляет эту конфигурацию (см., Что NODE_OPTIONS появился в версии 8.x!). В соответствии с этой статьей, разрешены только опции, занесенные в белый список в источнике (примечание: ссылка не обновлена!), "--max_old_space_size". Обратите внимание, что заголовок этой статьи немного вводит в заблуждение - кажется, что NODE_OPTIONS уже существовал, но я не уверен, что он раскрыл эту опцию.

Поэтому я вставил в свой .bashrc:
export NODE_OPTIONS=--max_old_space_size=4096

Ответ 6

Модуль increase-memory-limit. Начиная с Node.js v8.0, выпущенного в августе 2017 года, теперь мы можем использовать переменную NODE_OPTIONS env для глобальной установки max_old_space_size.

export NODE_OPTIONS=--max_old_space_size=4096

Ссылочный URL: https://github.com/endel/increase-memory-limit

Ответ 7

Просто вариант ответов выше.

Я попытался выполнить команду up node выше, но это предложение от этой Angular проблемы CLI работало для меня - вы создайте node script в вашем файле package.json, чтобы увеличить память, доступную для node, когда вы запускаете свою сборку.

Итак, если вы хотите увеличить доступную память до node до 4gb (max-old-space-size=4096), ваша команда node будет node --max-old-space-size=4096 ./node_modules/@angular/cli/bin/ng build --prod. (увеличение или уменьшение объема памяти в зависимости от ваших потребностей - 4gb работал у меня, но вам может потребоваться больше или меньше). Затем вы добавите его в свой раздел сценариев package.json следующим образом:

"prod": "node --max-old-space-size=4096 ./node_modules/@angular/cli/bin/ng build --prod"

Он будет содержаться в объекте scripts вместе с другими доступными скриптами - например:

"scripts": {
    "ng": "ng",
    "start": "ng serve",
    "build": "ng build",
    "test": "ng test",
    "lint": "ng lint",
    "e2e": "ng e2e",
    "prod": "node --max-old-space-size=4096./node_modules/@angular/cli/bin/ng build --prod"
}

И вы запустите его, вызвав npm run prod (вам может понадобиться запустить sudo npm run prod, если вы находитесь на Mac или Linux).

Обратите внимание, что может возникнуть основная проблема, из-за которой node потребуется больше памяти - это не относится к этому, если это относится к делу, но, по крайней мере, дает node памяти, которая должна выполнить сборку.

Ответ 8

Мое рабочее решение:

  • Установить кросс-env
    npm install --save-dev cross-env или npm install -g cross-env.
  • Файл package.json добавить новый скрипт сборки
    например
    ... "build:prod:ios": "cross-env NODE_OPTIONS='--max-old-space-size=8192' ionic cordova build ios --prod --release"...
  • Используйте эту команду для сборки в следующий раз.
    npm run build:prod:ios

  • Задача решена.

Ответ 9

Я потерял несколько дней с этой проблемой.... пока не обнаружил, что в каком-то файле я импортировал один статический файл, встроенный файл. Это заставляет сборку никогда не кончаться. Что-то вроде:

import PropTypes from "../static/build/prop-types"; 

Исправление к реальному источнику решило всю проблему.

Обмен моим решением.:)

Ответ 10

Альтернативное решение - отключить компилятор AOT:

ng build --prod --aot false

Ответ 11

Я видел эту проблему, когда создавал пакет для реагирования. Вещи, которые я пробовал и не работал:

  1. Увеличив node --max_old_space_size, как ни node --max_old_space_size, работал локально для меня, но не смог сработал у дженкинсов, и я все еще не уверен, что пошло не так с дженкинсами
  2. В некоторых местах упоминается версия узла до 6.9.1, и это тоже не сработало. Я просто хотел бы поставить это здесь, поскольку это может сработать для вас.

Вещь, которая действительно работала для меня: я импортировал действительно большой файл в код. Как я решил это, включив его в список ignore в .babelrc примерно так:

{
    "presets": ["react-native"],
    "plugins": ["transform-inline-environment-variables"],
    "ignore": ["*.json","filepathToIgnore.ext"]
}

Это был файл .js который действительно не нуждался в транспиляции, и добавление его в список игнорирования помогло.

Ответ 12

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

Для MAC: узел --max-old-space-size = 4096/usr/local/bin/ionic cordova build android --prod

Для Windows: узел --max-old-space-size = 4096/Пользователи/{ваш пользователь}/AppData/Роуминг /npm/node_modules/ionic/bin/ionic cordova build windows --prod

Ответ 13

эта ошибка возникает, когда требуемая память, выделенная для выполнения, меньше памяти, необходимой для запуска процесса. По умолчанию размер памяти узла составляет 512 МБ, чтобы увеличить его, вам нужно ввести следующую команду:

node --max-old-space-size= <NewSize> <fileName>

Ответ 14

  1. Перейдите в папку% appdata% → npm.
  2. Откройте ng.cmd в вашем любимом редакторе
  3. Добавьте --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; =;% узел "--max_old_space_size = 8192" "% ~ dp0\node_modules @angular\cli\bin\ng"% *)