web-dev-qa-db-fra.com

Node.js tas de mémoire

Aujourd'hui, j'ai exécuté mon script d'indexation de système de fichiers pour actualiser l'index des fichiers RAID. Après 4 heures, 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 RAM et de 24 Go d’échange de SSD. Je doute fortement que mon script dépasse 36 Go de mémoire. Au moins ça ne devrait pas

Le script crée un index des fichiers stockés sous forme de tableau d'objets avec leurs métadonnées (dates de modification, autorisations, etc., sans données volumineuses).

Voici le code de script complet: http://Pastebin.com/mjaD76c3

J'ai déjà expérimenté des problèmes de nœuds étranges dans le passé avec ce script, ce qui m'a forcé, par exemple. diviser l'index en plusieurs fichiers, car le nœud posait problème en travaillant sur de gros fichiers comme String. Existe-t-il un moyen d’améliorer la gestion de la mémoire de nodejs avec d’énormes jeux de données?

119
Lapsio

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

Dans l'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 une nouvelle commande d’espace mais comme je lis ici: un-tour-de-v8-garbage-collection le nouvel espace ne collecte 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.

170
Felix

J'ai rencontré ce problème lorsque j'essayais de déboguer avec VSCode. Je voulais donc simplement ajouter ceci: voici comment ajouter l'argument à votre configuration de débogage. 

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

Voir 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"
        ]
    }
]}
19
Astr-o

Juste au cas où quelqu'un se heurterait à cela dans un environnement où il ne pourrait pas définir directement les propriétés du nœud (dans mon cas, un outil de construction):

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

Vous pouvez définir les options de noeud à l'aide d'une variable d'environnement si vous ne pouvez pas les passer en ligne de commande.

15
Kamiel Wanrooij

j'avais du mal avec cela même après avoir réglé - max-old-space-size. 

Ensuite, j'ai réalisé qu'il fallait mettre les options - max-old-space-size avant le script karma.

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

10
duchuy

fwiw, trouver et réparer un gros porc avec quelque chose comme memwatch pourrait aider.

9
NathanQ

Si vous souhaitez augmenter l'utilisation de la mémoire du nœud de manière globale, et pas seulement d'un seul script, vous pouvez exporter une variable d'environnement, comme ceci:
export NODE_OPTIONS=--max_old_space_size=4096

Ensuite, vous n'avez pas besoin de jouer avec des fichiers lorsque vous exécutez des versions telles que npm run build.

8
Maksim Luzik

J'ai eu un problème similaire en faisant AOT construire angulaire. Les commandes suivantes m'ont aidé.

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

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

6
Chandru

Étapes à suivre -

  1. Ouvrez la commande Invite et tapez %appdata% appuyez sur entrée. 
  2. Accédez au dossier %appdata%> npm
  3. Ouvrez ou éditez ng.cmd dans votre éditeur favori
  4. Ajouter --max_old_space_size=8192 aux blocs IF et ELSE

Votre fichier node.cmd ressemble à ceci après le changement:

@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

Voici quelques valeurs d'indicateur pour ajouter des informations supplémentaires sur la manière d'autoriser plus de mémoire lorsque vous démarrez votre serveur de noeud. 

1 Go - 8 Go

#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

j'ai essayé ceci NODE_OPTIONS = --max-old-space-size = 8192.

fonctionne bien pour moi.

ne suggestion: -

juste essayé de commenter le console.log () sur le terminal. parce que cela prendra aussi de la mémoire. et utilise

2
Amar Powar

c'est simple, il suffit d'augmenter la mémoire de tas de 1 à 8 Go pour windows open powershell ou cmd dans votre répertoire de projet et taper ci-dessous la commande, pour mac open terminal dans ce répertoire 

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

J'ai essayé ???? le code ci-dessous et son bon fonctionnement✌.

  • terminal ouvert depuis le répertoire racine du projet
  • exécutez la cmd pour définir une nouvelle taille.

    set NODE_OPTIONS = - max_old_space_size = 8172

Ou vous pouvez consulter le lien pour plus d'informations https://github.com/nodejs/node/issues/10137#issuecomment-487255987

1
rkumar1904

Mettez à niveau le noeud vers la dernière version. J'étais sur le noeud 6.6 avec cette erreur et mis à niveau vers 8.9.4 et le problème a disparu.

1
Richard Frank

J'ai rencontré ce même problème récemment et suis tombé sur ce fil, mais mon problème était avec React App. Les modifications ci-dessous dans la commande de démarrage du nœud ont résolu mes problèmes.

Syntaxe

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

Exemple

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

Pourquoi la taille est 16000 dans max-old-space-size?

Fondamentalement, cela varie en fonction de la mémoire allouée à ce thread et de vos paramètres de nœud.

Comment vérifier et donner la bonne taille?

Ceci est fondamentalement rester dans notre moteur v8. Le code ci-dessous vous aide à comprendre la taille de segment de mémoire de votre moteur v8 de noeud local.

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

Juste au cas où cela pourrait aider les personnes ayant ce problème lors de l’utilisation des applications nodejs générant une journalisation lourde, un collègue a résolu ce problème en canalisant les sorties standard vers un fichier.

0
Adrien Joly

Dans mon cas, j'avais exécuté npm install sur la version précédente du noeud, après un jour, j'ai mis à niveau la version du noeud et ram npm install pour quelques modules. Après cela, j'ai eu cette erreur. Pour résoudre ce problème, j'ai supprimé le dossier node_module de chaque projet et exécuté npm install à nouveau.

J'espère que cela pourrait résoudre le problème.

Remarque: cela se produisait sur mon ordinateur local et cela a été corrigé uniquement sur l'ordinateur local.

0
Gampesh

Si vous essayez de lancer pas node lui-même, mais un autre logiciel, par exemple webpack, vous pouvez utiliser la variable d'environnement et le package cross-env:

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