ERREUR FATALE: CALL_AND_RETRY_LAST Échec de l’allocation – processus hors mémoire

La version du noeud est la v0.11.13

L’utilisation de la mémoire lors d’un crash en fonction de sudo top ne dépasse pas 3%

Code qui reproduit cette erreur:

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

Pour vérifier si un problème de taille de stack de récurrence, j’ai exécuté le code suivant avec le paramètre –stack-size = 60000

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

et ont

 264500 Segmentation fault 

Ensuite, j’ai exécuté le code qui me donne FATAL ERROR: CALL_AND_RETRY_LAST Échec de l’allocation – processus en dehors de la mémoire avec le même paramètre –stack-size = 60000 et n’a pas de Segmentation fault .

Je conclus donc que CALL_AND_RETRY_LAST n’a rien de commun avec la taille de la stack de récurrence.

Comment pourrais-je résoudre ce problème? Je crois qu’il y a suffisamment de mémoire disponible sur mon ordinateur pour terminer cette tâche avec succès.

Il y a des questions similaires sur stackoverflow mais aucune de ces questions ne concerne CALL_AND_RETRY_LAST c’est pourquoi j’ai créé une question séparée.

Si vous regardez la source: github / v8 , il semble que vous essayiez de réserver un très gros object? Mon expérience est que cela se produit si vous essayez d’parsingr un object JSON énorme, mais quand j’essaie d’parsingr votre sortie avec JSON et node0.11.13, cela fonctionne très bien.

Vous n’avez pas besoin de plus --stack-size , vous avez besoin de plus de mémoire: --max_new_space_size et / ou --max_old_space_size .

Le seul conseil que je puisse vous donner à ce propos: essayez un autre parsingur JSON et / ou essayez de changer le format d’entrée en ligne JSON au lieu de JSON uniquement.

Pour résoudre ce problème, vous devez exécuter votre application en augmentant la limite de mémoire en utilisant l’option --max_old_space_size . Par défaut, la limite de mémoire de Node.js est de 512 Mo.

 node --max_old_space_size=2000 server.js 

J’ai trouvé que max_new_space_size n’est pas une option dans le noeud 4.1.1 et que max_old_space_size seul n’a pas résolu mon problème. J’ajoute ce qui suit à mon shebang et la combinaison de ceux-ci semble fonctionner:

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

[UPDATE]: A également découvert cette erreur lors de l’exécution de grunt qui était précédemment exécuté comme suit:

 ./node_modules/.bin/grunt 

Après avoir mis à jour la commande à la suivante, il a cessé d’avoir des erreurs de mémoire:

 node --max_old_space_size=2048 ./node_modules/.bin/grunt 
 sudo npm install -g increase-memory-limit 

Exécuter à partir de l’emplacement racine de votre projet:

 increase-memory-limit 

Cet outil appenda –max-old-space-size = 4096 dans tous les appels de nœuds à l’intérieur de vos fichiers node_modules / .bin / *.

Juste une variation sur les réponses ci-dessus.

J’ai essayé la commande de nœud ci-dessus sans succès, mais la suggestion de ce problème de la CLI angular a fonctionné pour moi: vous créez un script Node dans votre fichier package.json pour augmenter la mémoire disponible pour Node lorsque vous exécutez votre version de production.

Donc, si vous voulez augmenter la mémoire disponible pour Node à 4 Go ( max-old-space-size=4096 ), votre commande Node serait node --max-old-space-size=4096 ./node_modules/@angular/cli/bin/ng build --prod . (Augmentez ou diminuez la quantité de mémoire en fonction de vos besoins. 4 Go fonctionnaient pour moi, mais vous pourriez avoir besoin de plus ou moins). Vous l’appendiez alors à votre section ‘scripts’ de package.json comme ceci:

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

Il serait contenu dans l’object scripts avec les autres scripts disponibles – par exemple:

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

Et vous l’exécutez en appelant npm run prod (vous devrez peut-être lancer sudo npm run prod si vous êtes sur Mac ou Linux).

Notez qu’il peut y avoir un problème sous-jacent qui oblige Node à avoir plus de mémoire – cela ne le fait pas si c’est le cas – mais au moins il donne à Node la mémoire dont il a besoin pour effectuer la génération.

Remarque: consultez l’avertissement dans les commentaires sur la manière dont cela peut affecter les applications Electron.

À compter de la version 8.0 d’août 2017, la variable d’environnement NODE_OPTIONS expose cette configuration (voir NODE_OPTIONS dans la version 8.x! ). Selon l’article, seules les options figurant sur la liste blanche (note: pas de lien à jour!) Sont autorisées, y compris "--max_old_space_size" . Notez que le titre de cet article semble un peu trompeur – il semble que NODE_OPTIONS existe déjà, mais je ne suis pas sûr que cette option ait été exposée.

Alors je mets dans mon .bashrc :
export NODE_OPTIONS=--max_old_space_size=4096

Le module increase-memory-limit est maintenant obsolète. À compter de août 2008, Nodejs v8.0 peut désormais utiliser la variable env NODE_OPTIONS pour définir globalement la max_old_space_size .

export NODE_OPTIONS=--max_old_space_size=4096

URL de référence: https://github.com/endel/increase-memory-limit

J’ai perdu quelques jours avec ce problème… jusqu’à ce que je trouve que dans certains fichiers, j’importais un fichier statique, un fichier construit. Cela fait que la construction ne finira jamais. Quelque chose comme:

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

La fixation à la source réelle a résolu tous les problèmes.

Partager ma solution 🙂

Une solution alternative consiste à désactiver le compilateur AOT:

 ng build --prod --aot false 

Je voyais ce problème lorsque je créais un paquet pour réagir à nouveau. Des choses que j’ai essayées et qui n’ont pas fonctionné:

  1. En augmentant le node --max_old_space_size , cela a fonctionné de manière locale pour moi, mais a échoué sur jenkins et je ne suis toujours pas sûr de ce qui ne va pas avec jenkins
  2. Certains endroits mentionnés pour rétrograder la version de noeud à 6.9.1 et cela n’a pas fonctionné pour moi non plus. Je voudrais juste mettre ceci ici car cela pourrait fonctionner pour vous.

Chose qui a fonctionné pour moi: j’importais un très gros fichier dans le code. La façon dont je l’ai résolu était de l’inclure dans la liste des .babelrc dans .babelrc par .babelrc :

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

C’était un fichier .js qui n’avait pas vraiment besoin de transpiling et l’append à la liste des ignorés était utile.