it-swarm.com.de

Node.js hat keinen Speicher mehr

Heute habe ich mein Skript für die Indexierung des Dateisystems ausgeführt, um den Index der RAID-Dateien zu aktualisieren. Nach 4 Stunden stürzte es mit folgendem Fehler ab:

[md5:]  241613/241627 97.5%  
[md5:]  241614/241627 97.5%  
[md5:]  241625/241627 98.1%
Creating missing list... (79570 files missing)
Creating new files list... (241627 new files)

<--- Last few GCs --->

11629672 ms: Mark-sweep 1174.6 (1426.5) -> 1172.4 (1418.3) MB, 659.9 / 0 ms [allocation failure] [GC in old space requested].
11630371 ms: Mark-sweep 1172.4 (1418.3) -> 1172.4 (1411.3) MB, 698.9 / 0 ms [allocation failure] [GC in old space requested].
11631105 ms: Mark-sweep 1172.4 (1411.3) -> 1172.4 (1389.3) MB, 733.5 / 0 ms [last resort gc].
11631778 ms: Mark-sweep 1172.4 (1389.3) -> 1172.4 (1368.3) MB, 673.6 / 0 ms [last resort gc].


<--- JS stacktrace --->

==== JS stack trace =========================================

Security context: 0x3d1d329c9e59 <JS Object>
1: SparseJoinWithSeparatorJS(aka SparseJoinWithSeparatorJS) [native array.js:~84] [pc=0x3629ef689ad0] (this=0x3d1d32904189 <undefined>,w=0x2b690ce91071 <JS Array[241627]>,L=241627,M=0x3d1d329b4a11 <JS Function ConvertToString (SharedFunctionInfo 0x3d1d3294ef79)>,N=0x7c953bf4d49 <String[4]\: ,\n  >)
2: Join(aka Join) [native array.js:143] [pc=0x3629ef616696] (this=0x3d1d32904189 <undefin...

FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory
 1: node::Abort() [/usr/bin/node]
 2: 0xe2c5fc [/usr/bin/node]
 3: v8::Utils::ReportApiFailure(char const*, char const*) [/usr/bin/node]
 4: v8::internal::V8::FatalProcessOutOfMemory(char const*, bool) [/usr/bin/node]
 5: v8::internal::Factory::NewRawTwoByteString(int, v8::internal::PretenureFlag) [/usr/bin/node]
 6: v8::internal::Runtime_SparseJoinWithSeparator(int, v8::internal::Object**, v8::internal::Isolate*) [/usr/bin/node]
 7: 0x3629ef50961b

Der Server ist mit 16 GB RAM und 24 GB SSD-Swap ausgestattet. Ich bezweifle stark, dass mein Skript mehr als 36 GB Speicherplatz hat. Zumindest sollte es nicht

Skript erstellt Index von Dateien, die als Array von Objekten mit Metadaten von Dateien gespeichert sind (Änderungsdatum, Berechtigungen usw., keine großen Daten).

Hier ist der vollständige Skriptcode: http://Pastebin.com/mjaD76c3

Ich habe bereits mit diesem Skript seltsame Knotenprobleme erlebt, was mich zB gezwungen hat. Index in mehrere Dateien aufteilen, da der Knoten bei der Bearbeitung so großer Dateien wie String Probleme hatte. Gibt es eine Möglichkeit, die Speicherverwaltung von nodejs mit großen Datensätzen zu verbessern?

119
Lapsio

Wenn ich mich recht erinnere, gibt es in V8 ein striktes Standardlimit für die Speicherauslastung von etwa 1,7 GB, wenn Sie es nicht manuell erhöhen. 

In einem unserer Produkte folgten wir dieser Lösung in unserem Implementierungsskript:

 node --max-old-space-size=4096 yourFile.js

Es gibt auch einen neuen Space-Befehl, aber wie ich hier lese: a-tour-of-v8-garbage-collection Der neue Space sammelt nur die neu erstellten kurzfristigen Daten und der alte Space enthält alle referenzierten Datenstrukturen das sollte in Ihrem Fall die beste Option sein.

170
Felix

Ich bin auf dieses Problem gestoßen, als ich mit VSCode debuggen wollte. Ich wollte also nur hinzufügen, wie Sie das Argument zu Ihrem Debug-Setup hinzufügen können. 

Sie können es der runtimeArgs-Eigenschaft Ihrer Konfiguration in launch.json hinzufügen. 

Siehe Beispiel unten. 

{
"version": "0.2.0",
"configurations": [{
        "type": "node",
        "request": "launch",
        "name": "Launch Program",
        "program": "${workspaceRoot}\\server.js"
    },
    {
        "type": "node",
        "request": "launch",
        "name": "Launch Training Script",
        "program": "${workspaceRoot}\\training-script.js",
        "runtimeArgs": [
            "--max-old-space-size=4096"
        ]
    }
]}
19
Astr-o

Nur für den Fall, dass jemand darauf in einer Umgebung trifft, in der er keine Knoteneigenschaften direkt festlegen kann (in meinem Fall ein Build-Tool):

NODE_OPTIONS="--max-old-space-size=4096" node ...

Sie können die Knotenoptionen mithilfe einer Umgebungsvariablen festlegen, wenn Sie sie nicht in der Befehlszeile übergeben können.

15
Kamiel Wanrooij

ich hatte damit zu kämpfen, auch nachdem ich - max-old-space-size eingestellt hatte. 

Dann wurde mir klar, dass ich vor dem Karma-Skript die Optionen - max-old-space-size setzen muss.

auch am besten beide Syntaxen --max-old-space-size und --max_old_space_size mein Script für Karma angeben 

node --max-old-space-size=8192 --optimize-for-size --max-executable-size=8192  --max_old_space_size=8192 --optimize_for_size --max_executable_size=8192 node_modules/karma/bin/karma start --single-run --max_new_space_size=8192   --prod --aot

referenz https://github.com/angular/angular-cli/issues/1652

10
duchuy

fwiw, ein Gedächtnisschwarm zu finden und zu beheben, mit etwas wie memwatch könnte helfen.

9
NathanQ

Wenn Sie die Speichernutzung des Knotens global erhöhen möchten - nicht nur ein einzelnes Skript, können Sie Umgebungsvariablen wie folgt exportieren:
export NODE_OPTIONS=--max_old_space_size=4096

Dann müssen Sie beim Ausführen von Builds wie npm run build nicht mit Dateien spielen.

8
Maksim Luzik

Ich hatte ein ähnliches Problem, als ich den AOT-Winkelaufbau durchführte. Die folgenden Befehle haben mir geholfen.

npm install -g increase-memory-limit
increase-memory-limit

Quelle: https://geeklearning.io/angular-aot-webpack-memory-trick/

6
Chandru

Schritte zu beheben -

  1. Öffnen Sie die Eingabeaufforderung und geben Sie %appdata% ein, und drücken Sie die Eingabetaste 
  2. Navigieren Sie zum Ordner %appdata%> npm
  3. Öffnen oder bearbeiten Sie ng.cmd in Ihrem bevorzugten Editor
  4. Fügen Sie dem IF- und ELSE-Block --max_old_space_size=8192 hinzu

Ihre node.cmd-Datei sieht 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" %*
)
4
Umang Patwa

Hier einige Flag-Werte, um weitere Informationen hinzuzufügen, wie Sie beim Starten des Knotenservers mehr Speicherplatz zulassen. 

1 GB - 8 GB

#increase to 1gb
node --max-old-space-size=1024 index.js

#increase to 2gb
node --max-old-space-size=2048 index.js 

#increase to 3gb
node --max-old-space-size=3072 index.js

#increase to 4gb
node --max-old-space-size=4096 index.js

#increase to 5gb
node --max-old-space-size=5120 index.js

#increase to 6gb
node --max-old-space-size=6144 index.js

#increase to 7gb
node --max-old-space-size=7168 index.js

#increase to 8gb 
node --max-old-space-size=8192 index.js 

2
Nicholas

ich habe dies versucht NODE_OPTIONS = --max-old-space-size = 8192.

funktioniert gut für mich.

ein Vorschlag: -

ich habe gerade versucht, die Datei console.log () auf dem Terminal zu kommentieren. denn das wird auch gedächtnis brauchen. und verwenden

2
Amar Powar

erhöhen Sie einfach den Heap-Speicher von 1 - 8 GB für Windows, um Powershell oder cmd in Ihrem Projektverzeichnis zu öffnen, und geben Sie den Befehl .__ 

node --max-old-space-size={size in MBs} index.js
1
Basit Raza

Ich habe versucht ???? Der folgende Code und seine Funktionsweise working.

  • öffnen Sie das Terminal aus dem Projektstammverzeichnis
  • führen Sie den Befehl aus, um eine neue Größe festzulegen.

    setze NODE_OPTIONS = - max_old_space_size = 8172

Oder Sie können den Link für weitere Informationen überprüfen https://github.com/nodejs/node/issues/10137#issuecomment-487255987

1
rkumar1904

Aktualisieren Sie den Knoten auf die neueste Version. Ich war auf Knoten 6.6 mit diesem Fehler und habe ein Upgrade auf 8.9.4 durchgeführt, und das Problem wurde behoben.

1
Richard Frank

Ich habe das gleiche Problem vor kurzem konfrontiert und bin auf diesen Thread gestoßen, aber mein Problem war mit React App. Die folgenden Änderungen im Befehl "node start" haben meine Probleme behoben.

Syntax

node --max-old-space-size=<size> path-to/fileName.js

Beispiel

node --max-old-space-size=16000 scripts/build.js

Warum ist Größe 16000 in Max-Old-Space-Größe?

Grundsätzlich hängt dies vom zugewiesenen Speicher dieses Threads und Ihren Knoteneinstellungen ab.

Wie überprüfe und gebe ich die richtige Größe?

Dies ist im Grunde in unserem Motor bleiben v8. Der folgende Code hilft Ihnen dabei, die Heap-Größe Ihrer lokalen Node-V8-Engine zu verstehen.

const v8 = require('v8');
const totalHeapSize = v8.getHeapStatistics().total_available_size;
const totalHeapSizeGb = (totalHeapSize / 1024 / 1024 / 1024).toFixed(2);
console.log('totalHeapSizeGb: ', totalHeapSizeGb);
1
Venkat.R

Nur für den Fall, dass Personen, die dieses Problem haben, bei der Verwendung von nodejs-Apps, die eine starke Protokollierung erzeugen, hilfreich sein könnte, löste ein Kollege dieses Problem, indem er die Standardausgabe (en) in eine Datei leitete.

0
Adrien Joly

In meinem Fall hatte ich npm install auf einer früheren Version des Knotens ausgeführt. Nach einem Tag habe ich die Knotenversion und den RAM-npm install für einige Module aktualisiert. Danach bekam ich diesen Fehler. Um dieses Problem zu beheben, habe ich den Ordner node_module aus jedem Projekt gelöscht und npm install erneut ausgeführt.

Hoffe, das könnte das Problem beheben.

Hinweis: Dies geschah auf meinem lokalen Computer und wurde nur auf dem lokalen Computer behoben.

0
Gampesh

Wenn Sie versuchen, nicht node selbst zu starten, sondern eine andere Software, zum Beispiel webpack, können Sie die Umgebungsvariable und das cross-env-Paket verwenden:

$ cross-env NODE_OPTIONS='--max-old-space-size=4096' \
  webpack --progress --config build/webpack.config.dev.js
0
Piterden