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

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

  1. Увеличение node --max_old_space_sizeИнтересно, что это работало локально для меня, но не помогло Дженкинсу, и я все еще не уверен, что не так с Дженкинсом
  2. В некоторых местах упоминалось понижение версии узла до 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

увеличение-памяти предел

ИЛИ ЖЕ

  1. Перейдите в папку%appdata% -> npm или C:\Users\{user_name}\AppData\Roaming\npm
  2. Откройте ng.cmd в вашем любимом редакторе
  3. добавлять --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
Другие вопросы по тегам