FATAL ERROR: CALL_AND_RETRY_LAST Allocazione non riuscita - processo esaurito


187

La versione del nodo è v0.11.13

L'utilizzo della memoria durante l'arresto anomalo sudo topnon si risolve3%

Codice che riproduce questo errore:

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 )
})

Per verificare se si tratta di un problema relativo alla dimensione dello stack di ricorsione, ho eseguito il codice successivo con il parametro --stack-size = 60000

var depth = 0;

(function recurse() {
    // log at every 500 calls
    (++depth % 500) || console.log(depth);
    recurse();
})();

e ho

264500 
Segmentation fault

Quindi ho eseguito il codice che mi dà ERRORE FATALE: CALL_AND_RETRY_LAST Allocazione non riuscita - processo esaurito con lo stesso parametro --stack-size = 60000 e non ho Segmentation fault.

Quindi concludo che CALL_AND_RETRY_LASTnon ha nulla in comune con le dimensioni dello stack di ricorsione.

Come potrei risolvere questo problema? Credo che ci sia abbastanza memoria libera sul mio computer per completare questa attività con successo.

Ci sono domande simili su StackOverflow ma nessuna di queste domande riguarda CALL_AND_RETRY_LASTil motivo per cui ho creato una domanda separata.


3
Il tuo codice funziona bene per me con Node.js 0.10.28. Ci vollero 1200 MB di memoria virtuale e stamparono una quantità incredibile di spazzatura sullo schermo, ma sembrò "funzionare".
John Zwinck,

1
La spazzatura è esattamente ciò che desideravo ottenere. La cosa negativa è che il nodo 0.10. * Non supporta i generatori di armonia, quindi non posso usarlo per questo scopo.
user619271

Risposte:


112

Se dai un'occhiata al sorgente: github / v8 , sembra che tu provi a riservare un oggetto molto grande. Secondo la mia esperienza, succede se provi ad analizzare un enorme oggetto JSON, ma quando provo ad analizzare il tuo output con JSON e node0.11.13, funziona bene.

Non hai bisogno di più --stack-size, hai bisogno di più memoria: --max_new_space_sizee / o --max_old_space_size.

L'unico suggerimento che posso darti accanto è quello di provare un altro parser JSON e / o provare a cambiare il formato di input in linea JSON anziché solo JSON.


10
Grazie mille! Definire --max_old_space_size = 2000000, che credo significhi che ~ 2 GB hanno risolto il mio problema. Variabile --max_new_space_size non sembra avere alcun effetto.
user619271

Ho anche dato un'occhiata alla fonte v8 ma non ho capito cosa stesse succedendo lì. Quindi le mie possibilità di risolverlo senza il tuo aiuto probabilmente tendono a zero. Quindi grazie ancora.
user619271

1
@ theWanderer4865 che cosa intendi con "prova a cambiare il formato di input in linea JSON anziché solo JSON"? Potresti per favore elaborare? Grazie.
titusmagnus,

16
@ user619271 --max_old_space_size = 2048 è 2 GB
Timeless

1
Haha .. @Timeless
technophyle

51
$ sudo npm i -g increase-memory-limit

Esegui dalla posizione principale del progetto:

$ increase-memory-limit

Questo strumento aggiungerà --max-old-space-size = 4096 in tutte le chiamate ai nodi all'interno dei file node_modules / .bin / *.


Versione Node.js> = 8 - AVVISO DI DEPRECAZIONE

Da NodeJs V8.0.0, è possibile utilizzare l'opzione --max-old-space-size. NODE_OPTIONS = opzioni ...

$ export NODE_OPTIONS=--max_old_space_size=4096

ciao, @ sol-ibit. Cosa significa argomento 4096?
estebanpdl,

1
Ciao @estebanpdl, La soluzione per eseguire l'app Node.js con memoria maggiore è avviare il processo con un flag V8 aggiuntivo: --max-old-space-size. È necessario aggiungere la dimensione della memoria desiderata in megabyte. Il comando seguente avvierà l'applicazione con un limite di memoria di 4 GB.
sol404,

1
L'impostazione della variabile con ha export NODE_OPTIONS=--max_old_space_size=4096fatto il trucco per me! Grazie!
Taratore,

46

Per risolvere questo problema, è necessario eseguire l'applicazione aumentando il limite di memoria utilizzando l'opzione --max_old_space_size. Per impostazione predefinita, il limite di memoria di Node.js è 512 mb.

node --max_old_space_size=2000  server.js 

5
Esiste una guida dettagliata su come eseguire questa operazione, per favore? Dove posso incollare questo codice fedele: node --max_old_space_size=2000 server.js
Mr. Benedict

@ Mr.Benedict lo fai quando avvii la tua candidatura.
easymoden00b

2
node --max_old_space_size = 2048 server.js ... è più appropriato ... funziona grazie
danday74

1
Ho un'app React su google cloud. Come posso fare questo? Qualcuno può guidare, per favore?
Shubham Kushwah,

1
@ easymoden00b Non lo è node server.js, anzi npm start. Come posso fare questo?
Shubham Kushwah,

30

Ho scoperto che max_new_space_sizenon è un'opzione nel nodo 4.1.1 e max_old_space_sizeda sola non ha risolto il mio problema. Sto aggiungendo quanto segue al mio shebang e la combinazione di questi sembra funzionare:

#!/usr/bin/env node --max_old_space_size=4096 --optimize_for_size --max_executable_size=4096 --stack_size=4096

[MODIFICA]: 4096 === 4 GB di memoria, se il dispositivo ha poca memoria, è possibile scegliere una quantità inferiore.

[AGGIORNAMENTO]: anche scoperto questo errore durante l'esecuzione di grunt che in precedenza era stato eseguito in questo modo:

./node_modules/.bin/grunt

Dopo aver aggiornato il comando nel modo seguente ha smesso di avere errori di memoria:

node --max_old_space_size=2048 ./node_modules/.bin/grunt 

4
Ho aggiunto --max_old_space_size = 8192, non ha ancora risolto il problema ma ha
bloccato il

Ho ridotto la quantità di memoria nell'esempio da 8 GB a 4 GB, grazie per il feedback.
jfunk,

28

Nota: vedere l'avviso nei commenti su come ciò può influire sulle applicazioni elettroniche.

A partire dalla v8.0 spedita ad agosto 2017, la variabile d'ambiente NODE_OPTIONS espone questa configurazione (vedi NODE_OPTIONS è atterrato in 8.x! ). Secondo l'articolo, sono consentite solo le opzioni autorizzate nella fonte (nota: non un collegamento aggiornato!), Che include "--max_old_space_size". Nota che il titolo di questo articolo sembra un po 'fuorviante: sembra che NODE_OPTIONS fosse già esistito, ma non sono sicuro che abbia esposto questa opzione.

Quindi ho inserito il mio .bashrc:
export NODE_OPTIONS=--max_old_space_size=4096


Avvertenza: non impostarlo come variabile di ambiente sul tuo computer Windows. Si rompe tutto . Ha rotto GitKraken, Slack, il programma di installazione VS2017 (che è basato sul cromo), le estensioni VS2017 relative ad Azure e persino la voce di menu "Estensioni e aggiornamenti" in VS2017.
Roman Starkov,

Dai un'occhiata a github.com/electron/electron/issues/12695 - sembra che Electron non andrà in crash da NODE_OPTIONS in 2.0.3 - ma ho impostato NODE_OPTIONS utilizzando smartcd solo in directory di progetto specifiche per evitare questo problema github.com/cxreg / smartcd
Ben Creasy,

Ah, questo probabilmente spiega perché Discord e VS Code non sono stati influenzati.
Roman Starkov,

1
Come farlo su un computer Windows?
Mahmoud Ezzat,

16

Il increase-memory-limitmodulo è ora obsoleto. A partire da Node.js v8.0 spedito ad agosto 2017, ora possiamo usare la NODE_OPTIONSvariabile env per impostare max_old_space_sizeglobalmente.

export NODE_OPTIONS=--max_old_space_size=4096

URL di riferimento: https://github.com/endel/increase-memory-limit


Dove lo metti? Sto usando una build DevOps di Azure e le build non riescono negli agenti Windows
int-i

Per evitare la differenza multipiattaforma, installare il cross-envmodulo a livello globale ed eseguire sul terminale con tale comando -cross-env PORT=8000 node --max-old-space-size=4096 server.js
Ali David

Le build di Azure Devops vengono eseguite su agenti MS su cloud, non ci sono console per eseguirle. Ho trovato un altro modo per raggiungerli usando PowerShell. Aggiunto come risposta qui.
int-i

13

Solo una variazione sulle risposte sopra.

Ho provato il comando straight up node sopra senza successo, ma il suggerimento di questo problema della CLI angolare ha funzionato per me: tu crei uno script Node nel tuo package.jsonfile per aumentare la memoria disponibile per Node quando esegui la build di produzione.

Quindi, se si desidera aumentare la memoria disponibile per Node a 4 gb ( max-old-space-size=4096), il comando Node sarebbe node --max-old-space-size=4096 ./node_modules/@angular/cli/bin/ng build --prod. (aumenta o diminuisci la quantità di memoria a seconda delle tue esigenze - 4 GB ha funzionato per me, ma potresti aver bisogno di più o meno). Dovresti quindi aggiungerlo alla sezione "script" di package.json in questo modo:

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

Sarebbe contenuto nell'oggetto script insieme agli altri script disponibili, ad esempio:

"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"
}

E lo esegui chiamando npm run prod(potrebbe essere necessario eseguire sudo npm run prodse sei su un Mac o Linux).

Nota che potrebbe esserci un problema di fondo che sta facendo sì che Node abbia bisogno di più memoria - questo non risolve il problema in questo caso - ma almeno fornisce a Node la memoria necessaria per eseguire la compilazione.


6

La mia soluzione di lavoro è:

  • Installa cross-env
    npm install --save-dev cross-env o npm install -g cross-env.
  • Il file package.jsonaggiunge un nuovo script di creazione,
    ad es
    ... "build:prod:ios": "cross-env NODE_OPTIONS='--max-old-space-size=8192' ionic cordova build ios --prod --release" ...
  • Usa quel comando per costruire la prossima volta.
    npm run build:prod:ios

  • Problema risolto.


1

Ho perso alcuni giorni con questo problema .... fino a quando non ho scoperto che in un file stavo importando un file statico, un file incorporato. Fa sì che la build non finisca mai. Qualcosa di simile a:

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

Riparando alla fonte reale risolto tutto il problema.

Condividere la mia soluzione. :)


2
potresti spiegare un po 'di più la tua soluzione? Sto riscontrando lo stesso problema e si sta bloccando la mia applicazione. Tutto funziona bene per i primi minuti di esecuzione dell'app, ma alla fine si blocca a corto di memoria. Ma durante quel periodo Sequelize funziona bene.
Porlune,

1
Quello che è successo è che il mio IDE (WebStorm) includeva automaticamente i js BUILDED sui miei sorgenti ... quando un file (sui miei sorgenti) veniva cambiato, costruiva tutti i file in un nuovo output js. Ma se le mie fonti hanno riferimenti a file compilati, non si ferma mai alla compilazione. Controlla quale file include un file errato.
Tiago Gouvêa,

1

Stavo riscontrando questo problema quando stavo creando un bundle per reagire nativo. Cose che ho provato e non ha funzionato:

  1. Aumentando node --max_old_space_size, questo ha funzionato localmente per me ma non è riuscito su jenkins e non sono ancora sicuro di cosa vada storto con jenkins
  2. Alcuni punti menzionati per il downgrade della versione del nodo alla 6.9.1 e che non ha funzionato neanche per me. Vorrei solo metterlo qui perché potrebbe funzionare per te.

Cosa che ha funzionato per me: stavo importando un file molto grande nel codice. Il modo in cui l'ho risolto è stato includendolo ignorenell'elenco in .babelrcqualcosa del genere:

{
    "presets": ["react-native"],
    "plugins": ["transform-inline-environment-variables"],
    "ignore": ["*.json","filepathToIgnore.ext"]
}

Era un .jsfile che non aveva davvero bisogno di essere trasferito e l'aggiunta alla lista ignora ha aiutato.


1

questo errore si verifica quando la memoria richiesta allocata per l'esecuzione è inferiore alla memoria richiesta per il processo in esecuzione. Per impostazione predefinita, la dimensione della memoria del nodo è 512 mb per aumentare questo è necessario digitare il comando seguente:

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

1
qual è il nome del file qui?
Rashedul.Rubel,

1

Stavo affrontando questo problema in modo ionico e ho provato molte soluzioni, ma ho risolto questo eseguendo questo.

Per MAC: nodo --max-old-space-size = 4096 / usr / local / bin / ionic cordova build android --prod

Per Windows: nodo --max-old-space-size = 4096 / Users / {il tuo utente} / AppData / Roaming / npm / node_modules / ionic / bin / ionic cordova build windows --prod


1
npm install -g increase-memory-limit

aumento-memory-limit

O

  1. Passare alla cartella% appdata% -> npm o C:\Users\{user_name}\AppData\Roaming\npm
  2. Apri ng.cmd nel tuo editor preferito
  3. Aggiungi --max_old_space_size=8192al blocco IFeELSE

ora il file ng.cmd appare così dopo la modifica:

@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

In una macchina Windows eseguire il comando di seguito

impostare NODE_OPTIONS = - max_old_space_size = 4096



0

Chiunque ottenga questo errore con le pipeline di compilazione di Azure, prova il passaggio seguente per modificare la variabile di ambiente dell'agente di compilazione

Aggiungi un Azure build pipeline task-> Azure powershell script:Inlinescriptprima di compilare con le seguenti impostazioni

- 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 nel lavoro dint ionic-app-scripts.js

Ma dopo la modifica: il seguente file ha funzionato

node_modules / .bin / ionici app-scripts.cmd

Aggiungendo:

@IF EXIST "% ~ 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"% *)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.