FATAL ERROR: CALL_AND_RETRY_LAST Распределение не выполнено - процесс исчерпал память
Версия узла 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
Затем я запустил код, который выдает мне ФАТАЛЬНУЮ ОШИБКУ: CALL_AND_RETRY_LAST Распределение не удалось - процесс исчерпал память с тем же параметром --stack-size=60000 и не получил Segmentation fault
,
Итак, я заключаю CALL_AND_RETRY_LAST
не имеет ничего общего с размером стека рекурсии.
Как я мог решить эту проблему? Я считаю, что на моем компьютере достаточно свободной памяти, чтобы успешно выполнить эту задачу.
Есть похожие вопросы по stackru, но ни один из этих вопросов не касается CALL_AND_RETRY_LAST
вот почему я создал отдельный вопрос.
19 ответов
Если вы посмотрите на источник: github / v8, кажется, что вы пытаетесь зарезервировать один очень большой объект? Мой опыт показывает, что это происходит, если вы пытаетесь проанализировать огромный объект JSON, но когда я пытаюсь проанализировать ваш вывод с помощью JSON и node0.11.13, он просто работает нормально.
Вам не нужно больше --stack-size
Вам нужно больше памяти: --max_new_space_size
и / или --max_old_space_size
,
Единственный совет, который я могу вам дать, кроме этого: попробуйте другой JSON-парсер и / или попробуйте изменить формат ввода на строку JSON вместо только JSON.
sudo npm install -g increase-memory-limit
Запустите из корневого каталога вашего проекта:
increase-memory-limit
Этот инструмент добавит --max-old-space-size=4096 во все вызовы узлов в ваших файлах node_modules/.bin/*.
Чтобы решить эту проблему, вам нужно запустить приложение, увеличив предел памяти с помощью опции --max_old_space_size
, По умолчанию ограничение памяти Node.js составляет 512 МБ.
node --max_old_space_size=2000 server.js
Примечание: см. Предупреждение в комментариях о том, как это может повлиять на приложения 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
Я нашел это 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
[ОБНОВЛЕНИЕ]: Также обнаружил эту ошибку при запуске grunt, который ранее запускался так:
./node_modules/.bin/grunt
После обновления команды до следующей она перестала иметь ошибки памяти:
node --max_old_space_size=2048 ./node_modules/.bin/grunt
increase-memory-limit
модуль устарел. Начиная с версии Nodejs 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
Просто вариант ответов выше.
Я безуспешно пробовал приведенную выше команду прямого узла, но предложение из этой проблемы Angular CLI сработало для меня - вы создаете скрипт Node в своем 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
, (увеличьте или уменьшите объем памяти в зависимости от ваших потребностей - 4Гб у меня сработало, но вам может понадобиться больше или меньше). Затем вы добавили бы его в раздел "scripts" вашего 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 память, необходимую для выполнения сборки.
Вы также должны проверить, не установили ли вы случайно версию узла x86 вместо x64. Это случилось со мной, потому что nodejs.org предварительно выбрал x86 на моей машине x64 ...
Мое рабочее решение:
- Установить кросс-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
Задача решена.
In a Windows Machine run below command
set NODE_OPTIONS=--max_old_space_size=4096
Любой, кто получает эту ошибку с конвейерами сборки Azure, попробуйте следующий шаг, чтобы изменить переменную среды агента сборки.
Добавить Azure build pipeline task
-> Azure powershell script:Inlinescript
перед компиляцией с настройками ниже
- task: AzurePowerShell@3
displayName: 'Azure PowerShell script: InlineScript'
inputs:
azureSubscription: 'NYCSCA Azure Dev/Test (ea91a274-55c6-461c-a11d-758ef02c2698)'
ScriptType: InlineScript
Inline: '[Environment]::SetEnvironmentVariable("NODE_OPTIONS", "--max_old_space_size=16384", "Machine")'
FailOnStandardError: true
azurePowerShellVersion: LatestVersion
Я видел эту проблему, когда я создавал пакет для реагировать на родной. Вещи, которые я пытался и не работал:
- Увеличение
node --max_old_space_size
Интересно, что это работало локально для меня, но не помогло Дженкинсу, и я все еще не уверен, что не так с Дженкинсом - В некоторых местах упоминалось понижение версии узла до 6.9.1, и это тоже не сработало для меня. Я просто хотел бы поставить это здесь, так как это может работать для вас.
Это помогло мне: я импортировал действительно большой файл в коде. То, как я решил это, было включено в ignore
список в .babelrc
что-то вроде этого:
{
"presets": ["react-native"],
"plugins": ["transform-inline-environment-variables"],
"ignore": ["*.json","filepathToIgnore.ext"]
}
Это был .js
файл, который на самом деле не нуждался в переносе и добавлении его в список игнорирования, помог.
Я потерял несколько дней с этой проблемой.... пока не обнаружил, что в каком-то файле я импортировал один статический файл, встроенный файл. Это делает сборку никогда не кончаться. Что-то вроде:
import PropTypes from "../static/build/prop-types";
Прикрепление к реальному источнику решило все проблемы.
Поделиться своим решением.:)
npm install -g increase-memory-limit
увеличение-памяти предел
ИЛИ ЖЕ
- Перейдите в папку%appdata% -> npm или
C:\Users\{user_name}\AppData\Roaming\npm
- Откройте ng.cmd в вашем любимом редакторе
- добавлять
--max_old_space_size=8192
кIF
а такжеELSE
блок
Теперь файл ng.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" %*
)
#!/usr/bin/env node --max-old-space-size=4096 в файле ionic-app-scripts.js не работает
Но после модификации: следующий файл работал
node_modules/.bin/ionic-app-scripts.cmd
Добавлением:
@IF СУЩЕСТВУЕТ "%~dp0\node.exe" ( "%~dp0\node.exe" "%~dp0..@ionic\app-scripts\bin\ionic-app-scripts.js" %*) ELSE ( @SETLOCAL @SET PATHEXT=%PATHEXT:;.JS;=;% node --max_old_space_size=4096 "%~dp0..@ionic\app-scripts\bin\ionic-app-scripts.js" %*)
Я столкнулся с этой проблемой в ионном режиме и попробовал много решений, но решил это, выполнив это.
Для 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
Я заменил
с
node --max_old_space_size=8192 ./node_modules/@angular/cli/bin/ng build --prod
Поэтому вместо использования
ng build --prod
просто используйте указанную выше команду, начинающуюся с
node..
. Для создания производственной сборки нет необходимости использовать
ng server --prod
.
Если вы не хотите использовать
--prod
, просто удали его.
Итак, это команды для использования в терминале vs code
node --max_old_space_size=8192 ./node_modules/@angular/cli/bin/ng build --prod
node --max_old_space_size=8192 ./node_modules/@angular/cli/bin/ng serve
Эта ошибка возникает, когда требуемая память, выделенная для выполнения, меньше памяти, необходимой для запуска процесса. По умолчанию размер памяти узла составляет 512 МБ, чтобы увеличить его, вам нужно ввести следующую команду:
node --max-old-space-size= <NewSize> <fileName>
Альтернативное решение - отключить компилятор AOT:
ng build --prod --aot false