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
Мое рабочее решение:
Ответ 9
Я потерял несколько дней с этой проблемой.... пока не обнаружил, что в каком-то файле я импортировал один статический файл, встроенный файл. Это заставляет сборку никогда не кончаться. Что-то вроде:
import PropTypes from "../static/build/prop-types";
Исправление к реальному источнику решило всю проблему.
Обмен моим решением.:)
Ответ 10
Альтернативное решение - отключить компилятор AOT:
ng build --prod --aot false
Ответ 11
Я видел эту проблему, когда создавал пакет для реагирования. Вещи, которые я пробовал и не работал:
- Увеличив
node --max_old_space_size
, как ни node --max_old_space_size
, работал локально для меня, но не смог сработал у дженкинсов, и я все еще не уверен, что пошло не так с дженкинсами - В некоторых местах упоминается версия узла до 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
- Перейдите в папку% appdata% → npm.
- Откройте ng.cmd в вашем любимом редакторе
- Добавьте --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"% *)