FATAL ERROR: CALL_AND_RETRY_LAST Zuordnung fehlgeschlagen - Prozess nicht genügend Speicher


186

Knotenversion ist v0.11.13

Die Speichernutzung während des Absturzes steigt sudo topnicht an3%

Code, der diesen Fehler reproduziert:

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

Um zu überprüfen, ob dies ein Problem mit der Größe des Rekursionsstapels ist, habe ich den nächsten Code mit dem Parameter --stack-size = 60000 ausgeführt

var depth = 0;

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

und haben

264500 
Segmentation fault

Dann habe ich Code ausgeführt, der mir FATAL ERROR gibt: CALL_AND_RETRY_LAST Zuordnung fehlgeschlagen - Prozess mit dem gleichen Parameter --stack-size = 60000 nicht genügend Speicher und nicht vorhanden Segmentation fault.

Ich schließe daraus, dass CALL_AND_RETRY_LASTdie Größe des Rekursionsstapels nichts gemeinsam hat.

Wie könnte ich dieses Problem lösen? Ich glaube, auf meinem Computer ist genügend freier Speicher vorhanden, um diese Aufgabe erfolgreich abzuschließen.

Es gibt ähnliche Fragen zum Stapelüberlauf, aber bei keiner dieser Fragen geht es darum CALL_AND_RETRY_LAST, warum ich eine separate Frage erstellt habe.


3
Ihr Code funktioniert gut für mich mit Node.js 0.10.28. Es brauchte 1200 MB virtuellen Speicher und druckte unglaublich viel Müll auf den Bildschirm, aber es schien "zu funktionieren".
John Zwinck

1
Der Müll ist genau das, was ich haben wollte. Das Schlimme ist, dass der Knoten 0.10. * Keine Harmoniegeneratoren unterstützt, daher kann ich ihn nicht für diese Zwecke verwenden.
user619271

Antworten:


112

Wenn Sie sich die Quelle ansehen : github / v8 , scheinen Sie zu versuchen, ein sehr großes Objekt zu reservieren. Nach meiner Erfahrung passiert es, wenn Sie versuchen, ein riesiges JSON-Objekt zu analysieren, aber wenn ich versuche, Ihre Ausgabe mit zu analysieren JSON und Node0.11.13, es funktioniert einfach gut.

Sie brauchen nicht mehr --stack-size, Sie brauchen mehr Speicher: --max_new_space_sizeund / oder --max_old_space_size.

Der einzige Hinweis, den ich Ihnen daneben geben kann, ist, einen anderen JSON-Parser zu versuchen und / oder zu versuchen, das Eingabeformat in JSON-Zeile anstatt nur in JSON zu ändern.


10
Vielen Dank! Das Definieren von --max_old_space_size = 2000000, was meiner Meinung nach bedeutet, dass ~ 2 GB mein Problem gelöst haben. Variierend --max_new_space_size schien überhaupt keine Wirkung zu haben.
user619271

Ich habe mir auch die v8-Quelle angesehen, aber nicht verstanden, was dort überhaupt vor sich geht. Meine Chancen, dies ohne Ihre Hilfe zu lösen, liegen wahrscheinlich bei Null. Also nochmals vielen Dank.
user619271

1
@ theWanderer4865 was meinst du mit "versuche das Eingabeformat in JSON-Zeile anstatt nur in JSON zu ändern"? Könnten Sie bitte näher darauf eingehen? Danke dir.
Titusmagnus

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

1
Haha .. @ Timeless
Technophyle

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

Führen Sie vom Stammverzeichnis Ihres Projekts aus:

$ increase-memory-limit

Dieses Tool fügt --max-old-space-size = 4096 in allen Knotenaufrufen in Ihren node_modules / .bin / * -Dateien an.


Node.js version> = 8 - DEPRECATION NOTICE

Seit NodeJs V8.0.0 ist es möglich, die Option zu verwenden --max-old-space-size. NODE_OPTIONS = Optionen ...

$ export NODE_OPTIONS=--max_old_space_size=4096

hallo, @ sol-ibit. Was bedeutet 4096 Argument?
Estebanpdl

1
Hallo @estebanpdl, Die Lösung zum Ausführen Ihrer Node.js-App mit erhöhtem Speicher besteht darin, den Prozess mit einem zusätzlichen V8-Flag zu starten: --max-old-space-size. Sie müssen die gewünschte Speichergröße in Megabyte anhängen. Der folgende Befehl startet Ihre Anwendung mit einem Speicherlimit von 4 GB.
Sol404

1
Das Setzen der Variablen mit export NODE_OPTIONS=--max_old_space_size=4096hat den Trick für mich getan! Vielen Dank!
Tarator

46

Um dieses Problem zu beheben, müssen Sie Ihre Anwendung ausführen, indem Sie das Speicherlimit mithilfe der Option erhöhen --max_old_space_size. Standardmäßig beträgt das Speicherlimit von Node.js 512 MB.

node --max_old_space_size=2000  server.js 

5
Gibt es eine Schritt-für-Schritt-Anleitung, wie das geht? Wo füge ich diesen treuen Code ein: node --max_old_space_size=2000 server.js
Mr. Benedict

@ Mr.Benedict Sie tun dies, wenn Sie Ihre Bewerbung starten.
easymoden00b

2
Knoten --max_old_space_size = 2048 server.js ... ist besser geeignet ... funktioniert danke
danday74

1
Ich habe eine React-App in der Google Cloud. Wie kann ich das machen? Kann jemand bitte führen?
Shubham Kushwah

1
@ easymoden00b Es ist nicht node server.jseher npm start. Wie kann ich das machen?
Shubham Kushwah

30

Ich habe festgestellt, dass dies max_new_space_sizein Knoten 4.1.1 keine Option ist und max_old_space_sizeallein mein Problem nicht gelöst hat. Ich füge meinem Shebang Folgendes hinzu und die Kombination dieser scheint zu funktionieren:

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

[BEARBEITEN]: 4096 === 4 GB Arbeitsspeicher. Wenn auf Ihrem Gerät nur noch wenig Arbeitsspeicher vorhanden ist, möchten Sie möglicherweise eine kleinere Menge auswählen.

[UPDATE]: Dieser Fehler wurde auch beim Ausführen von grunt festgestellt, das zuvor wie folgt ausgeführt wurde:

./node_modules/.bin/grunt

Nach dem Aktualisieren des Befehls auf Folgendes traten keine Speicherfehler mehr auf:

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

4
Ich habe hinzugefügt --max_old_space_size = 8192, es hat das Problem immer noch nicht gelöst, aber meinen PC
aufgehängt

Ich habe die Speichermenge im Beispiel von 8 GB auf 4 GB gesenkt, danke für das Feedback.
jfunk

28

Hinweis: Beachten Sie die Warnung in den Kommentaren, wie sich dies auf Elektronenanwendungen auswirken kann.

Ab Version 8.0, die im August 2017 ausgeliefert wurde, macht die Umgebungsvariable NODE_OPTIONS diese Konfiguration verfügbar (siehe NODE_OPTIONS ist in 8.x gelandet! ). Gemäß dem Artikel sind nur Optionen zulässig, die in der Quelle auf der Whitelist stehen (Hinweis: kein aktueller Link!), Einschließlich "--max_old_space_size". Beachten Sie, dass der Titel dieses Artikels etwas irreführend erscheint - es scheint, dass NODE_OPTIONS bereits existiert hat, aber ich bin nicht sicher, ob diese Option verfügbar gemacht wurde.

Also habe ich meine .bashrc:
export NODE_OPTIONS=--max_old_space_size=4096


Warnung: Legen Sie dies nicht als Umgebungsvariable auf Ihrem Windows-Computer fest. Es bricht alles . Es hat GitKraken, Slack, das VS2017-Installationsprogramm (das auf Chrom basiert), Azure-bezogene VS2017-Erweiterungen und sogar den Menüpunkt "Erweiterungen und Updates" in VS2017 beschädigt.
Roman Starkov

Werfen Sie einen Blick auf github.com/electron/electron/issues/12695 - es sieht so aus, als würde Electron in 2.0.3 nicht von NODE_OPTIONS abstürzen - aber ich habe NODE_OPTIONS mit smartcd nur in bestimmten Projektverzeichnissen festgelegt, um dieses Problem zu vermeiden. Github.com/cxreg / smartcd
Ben Creasy

Ah, das erklärt wahrscheinlich, warum Discord und VS Code nicht betroffen waren.
Roman Starkov

1
Wie geht das auf einem Windows-Computer?
Mahmoud Ezzat

16

Das increase-memory-limitModul ist jetzt veraltet. Ab Node.js v8.0 , das im August 2017 ausgeliefert wurde, können wir jetzt die NODE_OPTIONSenv-Variable verwenden, um die max_old_space_sizeglobale Einstellung festzulegen .

export NODE_OPTIONS=--max_old_space_size=4096

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


Wo stellst du das ein? Ich verwende einen Azure DevOps-Build und Builds
int-i

Um plattformübergreifende Unterschiede zu vermeiden, installieren Sie das cross-envModul global und führen Sie es mit einem solchen Befehl auf dem Terminal aus -cross-env PORT=8000 node --max-old-space-size=4096 server.js
Ali David

Azure Devops-Builds werden auf MS-Agenten in der Cloud ausgeführt. Es gibt keine Konsolen, um sie auszuführen. Ich habe einen anderen Weg gefunden, dies mit Powershell zu erreichen. Als Antwort hier hinzugefügt.
Int-I

13

Nur eine Variation der obigen Antworten.

Ich habe den obigen Befehl "Straight Up Node" erfolglos ausprobiert, aber der Vorschlag aus diesem Angular CLI-Problem hat bei mir funktioniert. Sie erstellen ein Knotenskript in Ihrer package.jsonDatei, um den für Node verfügbaren Speicher zu erhöhen, wenn Sie Ihren Produktionsbuild ausführen.

Wenn Sie also den für Node verfügbaren Speicher auf 4 GB ( max-old-space-size=4096) erhöhen möchten, lautet Ihr Node-Befehl node --max-old-space-size=4096 ./node_modules/@angular/cli/bin/ng build --prod. (Erhöhen oder verringern Sie die Speicherkapazität je nach Ihren Anforderungen - 4 GB haben bei mir funktioniert, aber Sie benötigen möglicherweise mehr oder weniger). Sie würden es dann wie folgt zu Ihrem package.json-Abschnitt "scripts" hinzufügen:

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

Es würde zusammen mit den anderen verfügbaren Skripten im Skriptobjekt enthalten sein - z. B.:

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

Und Sie führen es durch Aufrufen aus npm run prod(möglicherweise müssen Sie es ausführen, sudo npm run prodwenn Sie einen Mac oder Linux verwenden).

Beachten Sie, dass möglicherweise ein zugrunde liegendes Problem vorliegt, das dazu führt, dass Node mehr Speicher benötigt - dies wird in diesem Fall nicht behoben -, aber es gibt Node zumindest den Speicher, den es zum Ausführen des Builds benötigt.


6

Meine Arbeitslösung ist:

  • Installieren Sie cross-env
    npm install --save-dev cross-env oder npm install -g cross-env.
  • Datei package.jsonneues Build-Skript hinzufügen,
    z
    ... "build:prod:ios": "cross-env NODE_OPTIONS='--max-old-space-size=8192' ionic cordova build ios --prod --release" ...
  • Verwenden Sie diesen Befehl, um das nächste Mal zu erstellen.
    npm run build:prod:ios

  • Problem gelöst.


1

Ich habe einige Tage mit diesem Problem verloren ... bis ich herausfand, dass ich in einer Datei eine statische Datei importierte, eine erstellte Datei. Es macht den Build nie zu Ende. Etwas wie:

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

Das Fixieren auf die reale Quelle löste das ganze Problem.

Meine Lösung teilen. :) :)


2
Können Sie Ihre Lösung etwas näher erläutern? Ich habe das gleiche Problem und meine Anwendung stürzt ab. In den ersten Minuten, in denen die App ausgeführt wird, funktioniert alles einwandfrei, aber dann stürzt sie schließlich ab, weil der Speicher knapp wird. Aber während dieser Zeit funktioniert Sequelize einwandfrei.
Porlune

1
Was passiert ist, ist, dass meine IDE (WebStorm) die BUILDED js automatisch in meine Quellen aufgenommen hat ... Wenn eine Datei (in meinen Quellen) geändert wurde, wurden alle Dateien in eine neue js-Ausgabe eingebaut. Wenn meine Quellen jedoch Verweise auf erstellte Dateien enthalten, wird die Erstellung nie unterbrochen. Überprüfen Sie, welche Dateien eine falsche Datei enthalten.
Tiago Gouvêa

1

Ich habe dieses Problem gesehen, als ich ein Bundle für React-Native erstellt habe. Dinge, die ich versucht habe und die nicht funktionierten:

  1. Eine Erhöhung der node --max_old_space_size, intrestingly arbeitete für mich vor Ort aber nicht auf jenkins und ich bin sicher , dass immer noch nicht , was mit jenkins schief geht
  2. Einige Stellen erwähnten, um die Version des Knotens auf 6.9.1 herunterzustufen, und das funktionierte auch bei mir nicht. Ich möchte dies nur hier einfügen, da es für Sie funktionieren könnte.

Das hat bei mir funktioniert: Ich habe eine wirklich große Datei in den Code importiert. Ich habe es so gelöst, indem ich es in die ignoreListe aufgenommen .babelrchabe:

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

Es war eine .jsDatei, die nicht wirklich transpiliert werden musste, und das Hinzufügen zur Ignorierliste hat geholfen.


1

Dieser Fehler tritt auf, wenn der für die Ausführung zugewiesene erforderliche Speicher geringer ist als der für die Ausführung des Prozesses erforderliche Speicher. Standardmäßig beträgt die Knotenspeichergröße 512 MB. Um dies zu erhöhen, müssen Sie den folgenden Befehl eingeben:

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

1
Wie lautet der Dateiname hier?
Rashedul.Rubel

1

Ich war mit diesem Problem in ionischer Hinsicht konfrontiert und habe viele Lösungen ausprobiert, dies jedoch durch Ausführen gelöst.

Für MAC: Knoten --max-old-space-size = 4096 / usr / local / bin / ionic cordova Build Android --prod

Für Windows: Knoten --max-old-space-size = 4096 / Benutzer / {Ihr Benutzer} / AppData / Roaming / npm / Knotenmodule / ionic / bin / ionic cordova build windows --prod


1
npm install -g increase-memory-limit

Speicherlimit erhöhen

ODER

  1. Navigieren Sie zum Ordner% appdata% -> npm oder C:\Users\{user_name}\AppData\Roaming\npm
  2. Öffnen Sie ng.cmd in Ihrem Lieblingseditor
  3. In --max_old_space_size=8192zu dem IFund ELSEBlock

Jetzt sieht die Datei ng.cmd nach der Änderung folgendermaßen aus:

@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

Führen Sie auf einem Windows-Computer den folgenden Befehl aus

setze NODE_OPTIONS = - max_old_space_size = 4096


0

Eine alternative Lösung besteht darin, den AOT-Compiler zu deaktivieren:

ng build --prod --aot false

1
Kannst du näher erläutern, warum falsch?
Codebrekers

0

Wenn dieser Fehler bei Azure-Build-Pipelines auftritt, führen Sie den folgenden Schritt aus, um die Umgebungsvariable des Build-Agenten zu ändern

Fügen Sie ein Azure build pipeline task-> Azure powershell script:Inlinescriptvor dem Kompilieren mit den folgenden Einstellungen hinzu

- 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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.