FATAL ERROR: CALL_AND_RETRY_LAST Распределение не выполнено - процесс завершен


187

Версия узла 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что не имеет ничего общего с размером стека рекурсии.

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

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


3
Ваш код отлично работает для меня с Node.js 0.10.28. Он занял 1200 МБ виртуальной памяти и вывел на экран невероятное количество мусора, но, похоже, это «сработало».
Джон Цвинк

1
Хлам это именно то, что я хотел получить. Плохо то, что узел 0.10. * Не поддерживает генераторы гармонии, поэтому я не могу использовать его для этих целей.
user619271

Ответы:


112

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

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

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


10
Большое спасибо! Определение --max_old_space_size = 2000000, которое, я считаю, означает, что ~ 2 ГБ решили мою проблему. Изменение --max_new_space_size, похоже, не оказало никакого влияния вообще.
user619271

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

1
@ theWanderer4865 Что вы имеете в виду под «попытаться изменить формат ввода на строку JSON вместо только JSON»? Не могли бы вы уточнить? Спасибо.
Титусмагн

16
@ user619271 --max_old_space_size = 2048 является 2gb
Timeless

1
Ха-ха .. @Timeless
технофил

51
$ sudo npm i -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

привет, @ sol-ibit. Что значит 4096 аргумент?
estebanpdl

1
Привет @estebanpdl, Решение для запуска приложения Node.js с увеличенной памятью состоит в том, чтобы запустить процесс с дополнительным флагом V8: --max-old-space-size. Вам нужно добавить желаемый объем памяти в мегабайтах. Следующая команда запустит ваше приложение с объемом памяти 4 ГБ.
sol404

1
Установка переменной с export NODE_OPTIONS=--max_old_space_size=4096помощью для меня! Спасибо!
таратор

46

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

node --max_old_space_size=2000  server.js 

5
Есть ли пошаговое руководство, как это сделать, пожалуйста? Где я могу вставить этот верный код: node --max_old_space_size=2000 server.js
Мистер Бенедикт

@ Mr.Benedict, вы делаете это при запуске приложения.
easymoden00b

2
узел --max_old_space_size = 2048 server.js ... более уместен ... работает, спасибо
danday74

1
У меня есть приложение React в облаке Google. Как я могу это сделать? Кто-нибудь может помочь, пожалуйста?
Шубхам Кушва

1
@ easymoden00b Это не node server.js, а npm start. Как я могу это сделать?
Шубхам Кушва

30

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

#!/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 

4
Я добавил --max_old_space_size = 8192, это все еще не решило проблему, но повесил мой компьютер :(
Dhyey

Я уменьшил объем памяти в примере с 8Gb до 4Gb, спасибо за отзыв.
jfunk

28

Примечание: см. Предупреждение в комментариях о том, как это может повлиять на приложения 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


Слово предупреждения: не устанавливайте это как переменную окружения на вашем компьютере с Windows. Это ломает все . Он сломал GitKraken, Slack, установщик VS2017 (на основе хрома), связанные с Azure расширения VS2017 и даже пункт меню «Расширения и обновления» в VS2017.
Роман Старков

Взгляните на github.com/electron/electron/issues/12695 - похоже, что Electron не вылетит из NODE_OPTIONS в 2.0.3 - но я установил NODE_OPTIONS, используя smartcd только в определенных каталогах проектов, чтобы избежать этой проблемы github.com/cxreg / smartcd
Бен

Ах, это, вероятно, объясняет, почему Discord и VS Code не были затронуты.
Роман Старков

1
Как это сделать на машине с Windows?
Махмуд Эззат

16

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


Где вы это установите? Я использую сборку Azure DevOps, и сборка
int-i

Чтобы избежать межплатформенного различия, установите cross-envмодуль глобально и запустите на терминале с такой командой -cross-env PORT=8000 node --max-old-space-size=4096 server.js
Али Дэвид

Сборки Azure Devops выполняются на агентах MS в облаке, консолей для их выполнения нет. Я нашел другой способ добиться этого с помощью powershell. Добавил это как ответ сюда.
INT-я

13

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

Я безуспешно пробовал приведенную выше команду прямого узла, но предложение из этой проблемы 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 память, необходимую для выполнения сборки.


6

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

  • Установите перекрестный 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

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


1

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

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

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

Поделиться своим решением. :)


2
не могли бы вы объяснить свое решение немного больше? У меня такая же проблема, и это сбой моего приложения. Все отлично работает в течение первых нескольких минут работы приложения, но затем оно перестает работать из-за нехватки памяти. Но в этот период Sequelize работает отлично.
Porlune

1
Что случилось, так это то, что моя IDE (WebStorm) автоматически включала в мои источники файлы BUILDED js ... когда один файл (в моих источниках) был изменен, он собирал все файлы в новый вывод js. Но, если в моих источниках есть ссылки на встроенные файлы, сборка никогда не прекращается. Проверьте, какой файл содержит неверный файл.
Tiago Gouvêa

1

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

  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файл, который на самом деле не нуждался в транспорте, и добавление его в список игнорирования помогло.


1

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

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

1
какое здесь имя файла?
Rashedul.Rubel

1

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

Для 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


1
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" %*
)



0

Любой, кто получит эту ошибку с помощью конвейеров сборки 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

0

#! / usr / bin / env node --max-old-space-size = 4096 в работе файла ionic-app-scripts.js

Но после модификации: в следующем файле все заработало

node_modules / .bin / ионно-приложение-scripts.cmd

Добавляя:

@IF EXIST "% ~ dp0 \ node.exe" ("% ~ dp0 \ node.exe" "% ~ dp0 .. @ ionic \ app-scripts \ bin \ ionic-app-scripts.js"% *) ELSE ( @SETLOCAL @SET PATHEXT =% PATHEXT:;. JS; =;% узел --max_old_space_size = 4096 "% ~ dp0 .. @ ionic \ app-scripts \ bin \ ionic-app-scripts.js"% *)

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.