ERREUR FATALE: Échec de l'allocation CALL_AND_RETRY_LAST - processus à court de mémoire


187

La version du nœud est v0.11.13

Utilisation de la mémoire pendant le plantage selon sudo topne pas augmenter3%

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 c'est un problème de taille de pile de récursivité, 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 avoir

264500 
Segmentation fault

Ensuite, j'ai exécuté le code qui me donne FATAL ERROR: CALL_AND_RETRY_LAST Allocation a échoué - processus à court de mémoire avec le même paramètre --stack-size = 60000 et ne l'a pas obtenu Segmentation fault.

Je conclus donc CALL_AND_RETRY_LASTn'a rien de commun avec la taille de la pile de récursivité.

Comment pourrais-je résoudre ce problème? Je pense qu'il y a suffisamment de mémoire libre 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_LASTc'est pourquoi j'ai créé une question distincte.


3
Votre code fonctionne bien pour moi avec Node.js 0.10.28. Il a fallu 1 200 Mo de mémoire virtuelle et imprimé une quantité incroyable de déchets à l'écran, mais cela semblait «fonctionner».
— John Zwinck

1
La jonque est exactement ce que je voulais obtenir. La mauvaise chose est que le nœud 0.10. * Ne supporte pas les générateurs d'harmonie donc je ne peux pas l'utiliser à cette fin.
— user619271

Réponses:


112

Si vous regardez la source: github / v8 , il semble que vous essayez de réserver un très gros objet.Selon mon expérience, cela se produit si vous essayez d'analyser un énorme objet JSON, mais lorsque j'essaie d'analyser 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_sizeet / ou --max_old_space_size.

Le seul indice que je peux vous donner à côté est d'essayer un autre analyseur JSON et / ou d'essayer de changer le format d'entrée en ligne JSON au lieu de JSON uniquement.


10
Merci beaucoup! Définition de --max_old_space_size = 2000000, ce qui signifie que je crois que ~ 2 Go avait résolu mon problème. Varier --max_new_space_size ne semble pas avoir d'effet du tout.
— user619271

J'ai également jeté un coup d'œil sur la source v8 mais je n'ai pas du tout compris ce qui se passe là-bas. Mes chances de résoudre ce problème sans votre aide sont donc probablement nulles. Alors merci encore.
— user619271

1
@ theWanderer4865 que voulez-vous dire par "essayez de changer le format d'entrée en ligne JSON au lieu de JSON uniquement."? Pourriez-vous s'il vous plaît élaborer? Je vous remercie.
— titusmagnus

16
@ user619271 --max_old_space_size = 2048 est 2 Go
— Intemporel

1
Haha .. @Timeless
— technophyle

51
$ sudo npm i -g increase-memory-limit

Exécutez à partir de l'emplacement racine de votre projet:

$ increase-memory-limit

Cet outil ajoutera --max-old-space-size = 4096 dans tous les appels de nœuds dans vos fichiers node_modules / .bin / *.


Version Node.js> = 8 - AVIS DE DÉPRÉCIATION

Depuis NodeJs V8.0.0, il est possible d'utiliser l'option --max-old-space-size. NODE_OPTIONS = options ...

$ export NODE_OPTIONS=--max_old_space_size=4096

bonjour, @ sol-ibit. Que signifie l'argument 4096?
— estebanpdl

1
Salut @estebanpdl, La solution pour exécuter votre application Node.js avec une mémoire accrue consiste à démarrer le processus avec un indicateur V8 supplémentaire: --max-old-space-size. Vous devez ajouter la taille de mémoire souhaitée en mégaoctets. La commande suivante démarrera votre application avec une limite de mémoire de 4 Go.
— sol404

1
Définir la variable avec a export NODE_OPTIONS=--max_old_space_size=4096fait l'affaire pour moi! Merci!
— Tarator

46

Pour résoudre ce problème, vous devez exécuter votre application en augmentant la limite de mémoire à l'aide de 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 

5
Existe-t-il un guide étape par étape sur la façon de procéder s'il vous plaît? Où dois-je coller ce code fidèle: node --max_old_space_size=2000 server.js
— Mr. Benedict

@ Mr.Benedict vous faites cela lorsque vous démarrez votre application.
— easymoden00b

2
node --max_old_space_size = 2048 server.js ... est plus approprié ... fonctionne merci
— danday74

1
J'ai une application React sur Google Cloud. Comment puis-je faire ceci? Quelqu'un peut-il guider, s'il vous plaît?
— Shubham Kushwah

1
@ easymoden00b Ce n'est pas node server.jsplutôt npm start. Comment puis-je faire ceci?
— Shubham Kushwah

30

J'ai trouvé que ce max_new_space_sizen'est pas une option dans le nœud 4.1.1 et que max_old_space_sizeseul 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

[EDIT]: 4096 === 4 Go de mémoire, si votre appareil manque de mémoire, vous pouvez choisir une quantité plus petite.

[MISE À JOUR]: a également découvert cette erreur lors de l'exécution de grunt qui était auparavant exécuté comme suit:

./node_modules/.bin/grunt

Après avoir mis à jour la commande vers ce qui suit, il a cessé d'avoir des erreurs de mémoire:

node --max_old_space_size=2048 ./node_modules/.bin/grunt 

4
J'ai ajouté --max_old_space_size = 8192, cela n'a toujours pas résolu le problème mais j'ai suspendu mon PC :(
— Dhyey

J'ai réduit la quantité de mémoire dans l'exemple de 8 Go à 4 Go, merci pour les commentaires.
— jfunk

28

Remarque: voir l'avertissement dans les commentaires sur la façon dont cela peut affecter les applications Electron.

Depuis la v8.0 expédiée en août 2017, la variable d'environnement NODE_OPTIONS expose cette configuration (voir NODE_OPTIONS a atterri dans 8.x! ). Selon l'article, seules les options de la liste blanche dans la source (note: pas un lien à jour!) Sont autorisées, ce qui inclut "--max_old_space_size". Notez que le titre de cet article semble un peu trompeur - il semble que NODE_OPTIONS ait déjà existé, mais je ne suis pas sûr qu'il ait exposé cette option.

Alors j'ai mis dans mon .bashrc:
export NODE_OPTIONS=--max_old_space_size=4096


Mot d'avertissement: ne définissez pas cela comme une variable d'environnement sur votre machine Windows. Ça casse tout . Cela a cassé GitKraken, Slack, le programme d'installation de VS2017 (qui est basé sur le chrome), les extensions VS2017 liées à Azure et même l'élément de menu "Extensions et mises à jour" dans VS2017.
— Roman Starkov

Jetez un œil à github.com/electron/electron/issues/12695 - il semble qu'Electron ne plantera pas de NODE_OPTIONS dans la version 2.0.3 - mais j'ai défini NODE_OPTIONS en utilisant smartcd uniquement dans des répertoires de projet spécifiques pour éviter ce problème github.com/cxreg / smartcd
— Ben Creasy

Ah, cela explique probablement pourquoi Discord et VS Code n'ont pas été affectés.
— Roman Starkov

1
Comment faire cela sur une machine Windows?
— Mahmoud Ezzat

16

Le increase-memory-limitmodule est désormais obsolète. Depuis Node.js v8.0 expédié en août 2017, nous pouvons désormais utiliser la NODE_OPTIONSvariable env pour définir max_old_space_sizeglobalement.

export NODE_OPTIONS=--max_old_space_size=4096

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


Où placez-vous cela? J'utilise une build Azure DevOps et les builds échouent dans les agents Windows
— int-i

Pour éviter les différences entre plates-formes, installez le cross-envmodule globalement et exécutez-le sur le terminal avec une telle commande -cross-env PORT=8000 node --max-old-space-size=4096 server.js
— Ali David

Les builds Azure Devops sont exécutés sur des agents MS sur le cloud, il n'y a pas de console pour les exécuter. J'ai trouvé un autre moyen d'y parvenir en utilisant PowerShell. Ajouté comme réponse ici.
— int-i

13

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

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

Donc, si vous souhaitez 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 également la quantité de mémoire en fonction de vos besoins - 4 Go ont fonctionné pour moi, mais vous aurez peut-être besoin de plus ou moins). Vous l'ajouteriez ensuite à la 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'objet 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 l'exécuter sudo npm run prodsi vous êtes sur un Mac ou Linux).

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


6

Ma solution de travail est:

  • Installez cross-env
    npm install --save-dev cross-env ou npm install -g cross-env.
  • Fichier package.jsonajouter un nouveau script de construction,
    par exemple
    ... "build:prod:ios": "cross-env NODE_OPTIONS='--max-old-space-size=8192' ionic cordova build ios --prod --release" ...
  • Utilisez cette commande pour créer la prochaine fois.
    npm run build:prod:ios

  • Problème résolu.


1

J'ai perdu quelques jours avec ce problème ... jusqu'à ce que je trouve que dans un fichier j'importais un fichier statique, un fichier construit. Cela rend la construction sans fin. Quelque chose comme:

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

La fixation à la source réelle a résolu tout le problème.

Partager ma solution. :)


2
pouvez-vous expliquer un peu plus votre solution? J'ai ce même problème et il plante mon application. Tout fonctionne bien pendant les premières minutes de l'exécution de l'application, mais elle se bloque finalement à cause du manque de mémoire. Mais pendant cette période, Sequelize fonctionne bien.
— Porlune

1
Ce qui s'est passé, c'est que mon IDE (WebStorm) a automatiquement inclus les js BUILDED sur mes sources ... lorsqu'un fichier (sur mes sources) a été modifié, il construit tous les fichiers dans une nouvelle sortie js. Mais, si mes sources ont des références à des fichiers construits, cela n'arrête jamais de se construire. Vérifiez quel fichier contient un fichier incorrect.
— Tiago Gouvêa

1

Je voyais ce problème lorsque je créais un bundle pour réagir natif. Les choses que j'ai essayées et qui n'ont pas fonctionné:

  1. L'augmentation du node --max_old_space_size, intéressant cela a fonctionné localement 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 node à 6.9.1 et cela n'a pas fonctionné pour moi non plus. Je voudrais simplement 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 ignoreliste dans .babelrcquelque chose comme ceci:

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

C'était un .jsfichier qui n'avait pas vraiment besoin de transpiler et l'ajouter à la liste des ignorés a aidé.


1

cette erreur se produit lorsque la mémoire requise allouée pour l'exécution est inférieure à la mémoire requise pour l'exécution du processus. Par défaut, la taille de la mémoire du nœud est de 512 Mo pour l'augmenter, vous devez taper la commande suivante:

node --max-old-space-size= <NewSize> <fileName>

1
quel est le nom du fichier ici?
— Rashedul.Rubel

1

J'étais confronté à ce problème dans ionique et j'ai essayé de nombreuses solutions, mais je l'ai résolu en exécutant cela.

Pour MAC: node --max-old-space-size = 4096 / usr / local / bin / ionic cordova build android --prod

Pour Windows: node --max-old-space-size = 4096 / Users / {votre utilisateur} / AppData / Roaming / npm / node_modules / ionic / bin / ionic cordova build windows --prod


1
npm install -g increase-memory-limit

augmenter la limite de mémoire

OU

  1. Accédez au dossier% appdata% -> npm ou C:\Users\{user_name}\AppData\Roaming\npm
  2. Ouvrez ng.cmd dans votre éditeur préféré
  3. Ajouter --max_old_space_size=8192au bloc IFetELSE

maintenant le fichier ng.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" %*
)

1

Dans une machine Windows, exécutez la commande ci-dessous

set NODE_OPTIONS = - max_old_space_size = 4096



0

Quiconque obtient cette erreur avec les pipelines de build Azure, essayez l'étape ci-dessous pour modifier la variable d'environnement de l'agent de build

Ajouter un Azure build pipeline task-> Azure powershell script:Inlinescriptavant la compilation avec les paramètres ci-dessous

- task: AzurePowerShell@3
  displayName: 'Azure PowerShell script: InlineScript'
  inputs:
    azureSubscription: 'NYCSCA Azure Dev/Test (ea91a274-55c6-461c-a11d-758ef02c2698)'
    ScriptType: InlineScript
    Inline: '[Environment]::SetEnvironmentVariable("NODE_OPTIONS", "--max_old_space_size=16384", "Machine")'
    FailOnStandardError: true
    azurePowerShellVersion: LatestVersion

0

#! / usr / bin / env node --max-old-space-size = 4096 dans le travail ionic-app-scripts.js

Mais après la modification: le fichier suivant a fonctionné

node_modules / .bin / ionic-app-scripts.cmd

En ajoutant:

@IF EXIST "% ~ dp0 \ node.exe" ("% ~ dp0 \ node.exe" "% ~ dp0 .. @ ionic \ app-scripts \ bin \ ionic-app-scripts.js"% *) ELSE ( @SETLOCAL @SET PATHEXT =% PATHEXT:;. JS; =;% node --max_old_space_size = 4096 "% ~ dp0 .. @ ionic \ app-scripts \ bin \ ionic-app-scripts.js"% *)

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.