Frage Node.js Heap nicht genügend Arbeitsspeicher


Heute habe ich mein Skript zur Indexierung des Dateisystems ausgeführt, um den Index der RAID-Dateien zu aktualisieren, und nach 4 Stunden stürzte es mit dem folgenden 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

Server ist mit 16 GB RAM und 24 GB SSD-Swap ausgestattet. Ich bezweifle stark mein Skript überschritten 36 GB Speicher. Zumindest sollte es nicht

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

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

Ich habe schon seltsame Knotenprobleme in der Vergangenheit mit diesem Skript erlebt, was mich zB gezwungen hat. Teilen Sie den Index in mehrere Dateien auf, da der Knoten bei der Arbeit an so großen Dateien wie String störte. Gibt es eine Möglichkeit, Nodejs Speicherverwaltung mit riesigen Datensätzen zu verbessern?


75
2017-07-25 02:45


Ursprung


Antworten:


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

In einem unserer Produkte haben wir diese Lösung in unserem Bereitstellungsskript verfolgt:

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

Es würde auch einen neuen Space-Befehl geben, aber wie ich hier lese: a-tour-of-v8-Müllsammlung Der neue Space sammelt nur die neu erstellten Kurzzeitdaten und der alte Space enthält alle referenzierten Datenstrukturen, die in Ihrem Fall die beste Option sein sollten.


109
2017-07-25 05:29



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

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

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

13
2018-06-20 01:26



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 musste.

am besten geben Sie beide Syntaxen an --max-old-space-size und --max_old_space_size mein Skript für Karma:

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


4
2018-06-22 08:43



fwiw, ein Gedächtnisschwein mit etwas wie finden und reparieren Memwatch könnte helfen.


4
2018-06-30 16:00



Aktualisieren Sie den Knoten auf die neueste Version. Ich war an Knoten 6.6 mit diesem Fehler und auf 8.9.4 aktualisiert und das Problem ging weg.


3
2018-01-12 07:01



Nur für den Fall, dass es Benutzern helfen könnte, dieses Problem bei der Verwendung von nodejs-Apps zu vermeiden, die eine starke Protokollierung verursachen, hat ein Kollege dieses Problem gelöst, indem er die Standardausgabe (n) an eine Datei weitergeleitet hat.


1
2018-04-04 08:39



Ich hatte ein ähnliches Problem während AOT angular build. Folgende Befehle haben mir geholfen.

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

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


0
2017-07-31 11:52