378 votes

Le tas de Node.js n'a plus de mémoire

Aujourd'hui, j'ai exécuté mon script pour l'indexation des systèmes de fichiers afin de rafraîchir l'index des fichiers RAID et après 4h, il s'est écrasé avec l'erreur suivante :

[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

Le serveur est équipé de 16 Go de RAM et de 24 Go de SSD swap. Je doute fort que mon script ait dépassé 36gb de mémoire. Au moins, il ne devrait pas

script crée un index de fichiers stockés comme Array of Objects avec les métadonnées des fichiers (dates de modification, permissions, etc, pas de big data).

Voici le code complet du script : http://pastebin.com/mjaD76c3

J'ai déjà expérimenté des problèmes bizarres de noeud dans le passé avec ce script ce qui m'a forcé par exemple à diviser l'index en plusieurs fichiers car le noeud avait des problèmes lorsqu'il travaillait sur des fichiers aussi gros que String. Y a-t-il un moyen d'améliorer la gestion de la mémoire de nodejs avec d'énormes ensembles de données ?

0 votes

Pour Windows cmd : set NODE_OPTIONS=--max-old-space-size=8192

424voto

Felix Points 1598

Si je me souviens bien, il y a une limite standard stricte pour l'utilisation de la mémoire dans V8 d'environ 1,7 Go, si vous ne l'augmentez pas manuellement.

Dans un de nos produits, nous avons suivi cette solution dans notre script de déploiement :

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

Il y aurait aussi un nouveau commandement spatial mais comme je l'ai lu ici : un-tour-de-v8-garbage-collection le nouvel espace ne recueille que les données à court terme nouvellement créées et l'ancien espace contient toutes les structures de données référencées, ce qui devrait être dans votre cas la meilleure option.

0 votes

De la même manière cette configuration est pour nodejs indépendamment du framework.@Simer

6 votes

Je développe avec angular 4 et j'ai le même problème, quel doit être le fichier yourFile.js pour une application angular ?

0 votes

@VikramSingh utilisez vous ng serve ou distribuez-vous le résultat de ng build le dossier /dist par un autre serveur web comme express ? Mais si votre projet Angular utilise plus que la mémoire standard de 1,7 Go, vous avez peut-être un problème d'architecture dans votre application ? Il semblerait que vous utilisiez l'environnement de développement avec le démarrage de nmp. github.com/mgechev/angular-seed/issues/2063

113voto

Kamiel Wanrooij Points 4944

Juste au cas où quelqu'un rencontrerait ce problème dans un environnement où il ne peut pas définir directement les propriétés des nœuds (dans mon cas, un outil de construction) :

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

Vous pouvez définir les options de nœud à l'aide d'une variable d'environnement si vous ne pouvez pas les transmettre sur la ligne de commande.

4 votes

Pouvez-vous s'il vous plaît expliquer ce que vous voulez dire, quand vous dites " ...définir les options du nœud en utilisant une variable d'environnement... " ?

7 votes

@Keselme Une variable d'environnement est une variable qui a été définie sur le serveur et dont tous les processus peuvent lire les données. Ouvrez un terminal SSH sur votre serveur et tapez : MY_VAR=hello puis tapez : echo $MY_VAR. Vous verrez qu'il imprime "hello" dans le terminal. Vous venez de définir une variable d'environnement et de la relire.

0 votes

A fonctionné sur Ubuntu 18.04, j'ai juste ajouté la commande export à mon fichier bashrc

28voto

Astr-o Points 387

J'ai rencontré ce problème en essayant de déboguer avec VSCode, donc je voulais juste ajouter que c'est la façon dont vous pouvez ajouter l'argument à votre configuration de débogage.

Vous pouvez l'ajouter à la runtimeArgs de votre configuration dans launch.json .

Voir l'exemple ci-dessous.

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

1 votes

Est-ce que launch.json serait le même que package.json ?

0 votes

Non, launch.json est un fichier de configuration spécifique à l'exécution d'une application à partir de VS Code.

0 votes

Où se trouve le fichier launch.json pour VS Code ?

27voto

duchuy Points 316

Je me débattais avec ce problème même après avoir défini --max-old-space-size.

Ensuite, j'ai réalisé que je devais mettre les options --max-old-space-size avant le karma script.

il est également préférable de spécifier les deux syntaxes --max-old-space-size et --max_old_space_size mon script pour 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

référence https://github.com/angular/angular-cli/issues/1652

7 votes

" il est préférable de spécifier les deux syntaxes --max-old-space-size et --max_old_space_size "Vous n'avez pas besoin de le faire, ce sont des synonymes. De nodejs.org/api/cli.html#cli_options : "Toutes les options, y compris les options V8, permettent de séparer les mots à la fois par des tirets (-) ou des caractères de soulignement (_)."

7 votes

Max-executable-size a été supprimé et se termine par une erreur lorsqu'il est utilisé : github.com/nodejs/node/issues/13341

0 votes

J'ai dû le couper pour --max-old-space-size=8192 --optimize-for-size --max_old_space_size=8192 --optimize_for_size et cela a fonctionné

13voto

NathanQ Points 460

Pour trouver et corriger un problème de mémoire avec quelque chose comme memwatch pourrait aider.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X