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

Потім я запустив код, який дає мені FATAL ERROR: 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 тільки."? Чи можете ви, будь ласка, докладно? Дякую.
— titusmagnus

16
@ User619271 --max_old_space_size = 2048 є 2gb
— Timeless

1
Haha .. @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
node --max_old_space_size = 2048 server.js ... підходить більше ... працює спасибі
— danday74

1
У мене є хмара програма React у хмарі Google. Як я можу це зробити? Хтось може керувати, будь ласка?
— Shubham Kushwah

1
@ Easymoden00b Це не node server.js, а npm start. Як я можу це зробити?
— Shubham Kushwah

30

Я виявив, що 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

[EDIT]: 4096 === 4 Гб оперативної пам’яті, якщо у вашому пристрої мало пам’яті, ви можете вибрати менший обсяг.

[UPDATE]: Також виявив цю помилку під час запуску 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.

Станом на v8.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 (який базується на хромі), розширення VS2017, пов'язані з Azure, і навіть пункт меню «Розширення та оновлення» у VS2017.
— Роман Старков

Погляньте на github.com/electron/electron/isissue/12695 - схоже, що Електрон не вийде з ладу від NODE_OPTIONS в 2.0.3 - але я встановив NODE_OPTIONS, використовуючи smartcd, лише в конкретних каталогах проектів, щоб уникнути цього питання github.com/cxreg / smartcd
— Ben

Ах, це, мабуть, пояснює, чому розбрат та код Кодексу не вплинули.
— Роман Старков

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, а збірки провалюються в агентах Windows
— int-i

Щоб уникнути різниці між платформами, встановіть cross-envмодуль глобально та запустіть на терміналі з такою командою -cross-env PORT=8000 node --max-old-space-size=4096 server.js
— Ali David

Набори Azure Devops запускаються на агентах MS у хмарі, не існує консолей для їх виконання. Я знайшов інший спосіб досягти цього за допомогою полюсів. Тут додано як відповідь.
— int-i

13

Просто варіація відповідей вище.

Я спробував команду прямого вузла прямо вгору без успіху, але пропозиція цієї проблеми Angular CLI спрацювала для мене - ви створюєте у своєму package.jsonфайлі скрипт Node, щоб збільшити пам'ять, доступну для Node, коли ви запускаєте виробничу збірку.

Отже, якщо ви хочете збільшити доступну пам'ять Node до 4gb ( max-old-space-size=4096), ваша команда Node буде node --max-old-space-size=4096 ./node_modules/@angular/cli/bin/ng build --prod. (збільшити або зменшити об'єм пам'яті, залежно від ваших потреб - 4 Гб працював на мене, але вам може знадобитися більше або менше). Потім ви додасте його до розділу script.json "сценарії" таким чином:

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

Він міститиметься в об'єкті сценаріїв разом з іншими доступними сценаріями - наприклад:

"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 працює чудово.
— Порлуне

1
Що трапляється, це те, що мій IDE (WebStorm) автоматично включав BUILDED js у мої джерела ... коли один файл (з моїх джерел) був змінений, він збирає всі файли у новий js вихід. Але, якщо в моїх джерелах є посилання на вбудовані файли, він ніколи не припиняє будувати. Перевірте, який файл містить неправильний файл.
— Тіаго Говка

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 mb, щоб збільшити це, вам потрібно набрати наступну команду:

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

1
яке тут ім'я файлу?
— Рашедул.Рубель

1

Я зіткнувся з цим питанням в іонному і перепробував багато рішень, але вирішив це, запустивши це.

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

Для Windows: node --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" %*
)

1

У машині Windows запустіть команду нижче

встановити NODE_OPTIONS = - max_old_space_size = 4096



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 вузол --max-old-space-size = 4096 у роботі з dint-ionic-app-scriptpts.js

Але після Модифікації: працює наступний файл

node_modules / .bin / ionic-app-scriptpts.cmd

Додавши:

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.