ERROR FATAL: CALL_AND_RETRY_LAST Error de asignación: proceso sin memoria


187

La versión del nodo es v0.11.13

El uso de memoria durante el bloqueo de acuerdo con sudo topno se eleva3%

Código que reproduce este error:

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

Para verificar si es un problema de tamaño de pila de recursión, he ejecutado el siguiente código con el parámetro --stack-size = 60000

var depth = 0;

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

y tengo

264500 
Segmentation fault

Luego ejecuté el código que me da ERROR FATAL: CALL_AND_RETRY_LAST Error de asignación: proceso sin memoria con el mismo parámetro --stack-size = 60000 y no lo tengo Segmentation fault.

Así que concluyo que CALL_AND_RETRY_LASTno tiene nada en común con el tamaño de la pila de recursión.

¿Cómo podría resolver este problema? Creo que hay suficiente memoria libre en mi computadora para terminar esta tarea con éxito.

Hay preguntas similares en stackoverflow, pero ninguna de estas preguntas trata sobre CALL_AND_RETRY_LASTpor qué creé una pregunta por separado.


3
Su código funciona bien para mí con Node.js 0.10.28. Tomó 1200 MB de memoria virtual e imprimió una cantidad increíble de basura en la pantalla, pero parecía "funcionar".
— John Zwinck

1
La basura es exactamente lo que deseaba obtener. Lo malo es que el nodo 0.10. * No admite generadores de armonía, por lo que no puedo usarlo para este propósito.
— user619271

Respuestas:


112

Si echas un vistazo a la fuente: github / v8 , parece que intentas reservar un objeto muy grande. Según mi experiencia, sucede si intentas analizar un gran objeto JSON, pero cuando trato de analizar tu salida con JSON y node0.11.13, simplemente funciona bien.

No necesita más --stack-size, necesita más memoria: --max_new_space_sizey / o --max_old_space_size.

La única pista que puedo darle es probar otro analizador JSON y / o intentar cambiar el formato de entrada a la línea JSON en lugar de JSON solamente.


10
¡Muchas gracias! Definir --max_old_space_size = 2000000, que creo significa que ~ 2GB resolvieron mi problema. Variar --max_new_space_size no parece tener ningún efecto en absoluto.
— user619271

También eché un vistazo a la fuente v8 pero no entendí lo que está sucediendo allí. Por lo tanto, mis posibilidades de resolver esto sin su ayuda probablemente tienden a cero. Así que gracias de nuevo.
— user619271

1
@ theWanderer4865 ¿qué quiere decir con "intentar cambiar el formato de entrada a la línea JSON en lugar de JSON solamente"? ¿Podría por favor elaborar? Gracias.
— titusmagnus

16
@ user619271 --max_old_space_size = 2048 es de 2 gb
— Atemporal

1
Jaja .. @Timeless
— technophyle

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

Ejecute desde la ubicación raíz de su proyecto:

$ increase-memory-limit

Esta herramienta agregará --max-old-space-size = 4096 en todas las llamadas de nodo dentro de sus archivos node_modules / .bin / *.


Node.js version> = 8 - AVISO DE DEPRECACIÓN

Desde NodeJs V8.0.0, es posible usar la opción --max-old-space-size. NODE_OPTIONS = opciones ...

$ export NODE_OPTIONS=--max_old_space_size=4096

hola, @ sol-ibit. ¿Qué significa el argumento 4096?
— estebanpdl

1
Hola @estebanpdl, la solución para ejecutar su aplicación Node.js con mayor memoria es iniciar el proceso con un indicador V8 adicional: --max-old-space-size. Debe agregar el tamaño de memoria deseado en megabytes. El siguiente comando iniciará su aplicación con un límite de memoria de 4 GB.
— sol404

1
¡Establecer la variable con export NODE_OPTIONS=--max_old_space_size=4096hizo el truco para mí! ¡Gracias!
— Tarator

46

Para resolver este problema, debe ejecutar su aplicación aumentando el límite de memoria mediante la opción --max_old_space_size. Por defecto, el límite de memoria de Node.js es de 512 mb.

node --max_old_space_size=2000  server.js 

55
¿Hay una guía paso a paso sobre cómo hacer esto, por favor? ¿Dónde pego este código fiel: node --max_old_space_size=2000 server.js
— Sr. Benedict

@ Mr.Benedict, hace esto cuando inicia su aplicación.
— easymoden00b

2
nodo --max_old_space_size = 2048 server.js ... es más apropiado ... funciona gracias
— danday74

1
Tengo una aplicación React en Google Cloud. ¿Cómo puedo hacer esto? ¿Alguien puede guiar, por favor?
— Shubham Kushwah

1
@ easymoden00b No lo es node server.js, más bien npm start. ¿Cómo puedo hacer esto?
— Shubham Kushwah

30

Descubrí que max_new_space_sizeno es una opción en el nodo 4.1.1 y max_old_space_sizesolo no resolvió mi problema. Estoy agregando lo siguiente a mi shebang y la combinación de estos parece funcionar:

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

[EDITAR]: 4096 === 4 GB de memoria, si su dispositivo tiene poca memoria, puede elegir una cantidad menor.

[ACTUALIZACIÓN]: también descubrí este error al ejecutar Grunt, que anteriormente se ejecutaba así:

./node_modules/.bin/grunt

Después de actualizar el comando a lo siguiente, dejó de tener errores de memoria:

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

44
Agregué --max_old_space_size = 8192, todavía no resolvió el problema pero colgó mi pc :(
— Dhyey

Bajé la cantidad de memoria en el ejemplo de 8 Gb a 4 Gb, gracias por los comentarios.
— jfunk

28

Nota: vea la advertencia en los comentarios sobre cómo esto puede afectar las aplicaciones de Electron.

A partir de la versión 8.0 enviada en agosto de 2017, la variable de entorno NODE_OPTIONS expone esta configuración (ver NODE_OPTIONS ha aterrizado en 8.x! ). Según el artículo, solo se permiten las opciones incluidas en la lista blanca en la fuente (nota: ¡no es un enlace actualizado!), Que incluye "--max_old_space_size". Tenga en cuenta que el título de este artículo parece un poco engañoso: parece que NODE_OPTIONS ya existía, pero no estoy seguro de que haya expuesto esta opción.

Entonces puse en mi .bashrc:
export NODE_OPTIONS=--max_old_space_size=4096


Palabra de advertencia: no establezca esto como una variable de entorno en su máquina Windows. Se rompe todo . Rompió GitKraken, Slack, el instalador VS2017 (que está basado en cromo), las extensiones VS2017 relacionadas con Azure e incluso el elemento de menú "Extensiones y actualizaciones" en VS2017.
— Roman Starkov

Eche un vistazo a github.com/electron/electron/issues/12695 : parece que Electron no se bloqueará de NODE_OPTIONS en 2.0.3, pero configuré NODE_OPTIONS usando smartcd solo en directorios de proyectos específicos para evitar este problema github.com/cxreg / smartcd
— Ben Creasy

Ah, eso probablemente explica por qué Discord y VS Code no se vieron afectados.
— Roman Starkov

1
¿Cómo hacer eso en una máquina Windows?
— Mahmoud Ezzat

16

El increase-memory-limitmódulo ha quedado en desuso ahora. A partir de Node.js v8.0 enviado en agosto de 2017, ahora podemos usar la NODE_OPTIONSvariable env para establecer max_old_space_sizeglobalmente.

export NODE_OPTIONS=--max_old_space_size=4096

URL de referencia: https://github.com/endel/increase-memory-limit


¿Dónde pones esto? Estoy usando una compilación de Azure DevOps y las compilaciones fallan en los agentes de Windows
— int-i

Para evitar la diferencia entre plataformas, instale el cross-envmódulo globalmente y ejecute en la terminal con dicho comandocross-env PORT=8000 node --max-old-space-size=4096 server.js
— Ali Ali

Las compilaciones de Azure Devops se ejecutan en agentes de MS en la nube, no hay consolas para ejecutarlas. Encontré otra forma de lograr esto usando powershell. Lo agregué como respuesta aquí.
— int-i

13

Solo una variación de las respuestas anteriores.

Intenté el comando de nodo directo anterior sin éxito, pero la sugerencia de este problema de CLI angular funcionó para mí: crea un script de nodo en supackage.json archivo para aumentar la memoria disponible para Node cuando ejecuta su compilación de producción.

Entonces, si desea aumentar la memoria disponible para Node a 4 gb ( max-old-space-size=4096), su comando Node sería node --max-old-space-size=4096 ./node_modules/@angular/cli/bin/ng build --prod. (aumente o disminuya la cantidad de memoria dependiendo de sus necesidades también; 4 gb funcionaron para mí, pero es posible que necesite más o menos). Luego lo agregaría a la sección 'scripts' de su package.json de esta manera:

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

Estaría contenido en el objeto de scripts junto con los otros scripts disponibles, por ejemplo:

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

Y lo ejecuta llamando npm run prod(es posible que deba ejecutarlo sudo npm run prodsi está en una Mac o Linux).

Tenga en cuenta que puede haber un problema subyacente que está causando que Node necesite más memoria, esto no soluciona eso si ese es el caso, pero al menos le da a Node la memoria que necesita para realizar la compilación.


6

Mi solución de trabajo es:

  • Instalar cross-env
    npm install --save-dev cross-env o npm install -g cross-env.
  • Archivo package.jsonagregar nuevo script de compilación,
    por ejemplo
    ... "build:prod:ios": "cross-env NODE_OPTIONS='--max-old-space-size=8192' ionic cordova build ios --prod --release" ...
  • Usa ese comando para construir la próxima vez.
    npm run build:prod:ios

  • Problema resuelto.


1

Perdí algunos días con este problema ... hasta que descubrí que en algún archivo estaba importando un archivo estático, un archivo integrado. Hace que la construcción nunca termine. Algo como:

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

La fijación a la fuente real resolvió todo el problema.

Compartiendo mi solución. :)


2
¿podrías explicar tu solución un poco más? Tengo este mismo problema y está bloqueando mi aplicación. Todo funciona bien durante los primeros minutos de ejecución de la aplicación, pero finalmente se bloquea por falta de memoria. Pero durante ese período, Sequelize funciona bien.
— Porlune

1
Lo que sucedió es que mi IDE (WebStorm) incluía automáticamente los jS CONSTRUIDOS en mis fuentes ... cuando se cambió un archivo (en mis fuentes), construyó todos los archivos en una nueva salida js. Pero, si mis fuentes tienen referencias a archivos construidos, nunca se detiene para construir. Verifique qué archivo incluye un archivo incorrecto.
— Tiago Gouvêa

1

Estaba viendo este problema cuando estaba creando un paquete para reaccionar nativo. Cosas que probé y no funcionó:

  1. Aumentando el node --max_old_space_size , interesantemente, esto funcionó localmente para mí, pero falló en jenkins y todavía no estoy seguro de qué sucede con jenkins
  2. Algunos lugares mencionaron degradar la versión del nodo a 6.9.1 y eso tampoco funcionó para mí. Solo me gustaría poner esto aquí, ya que podría funcionar para usted.

Lo que sí funcionó para mí: estaba importando un archivo realmente grande en el código. La forma en que lo resolví fue incluyéndolo en la ignorelista en .babelrcalgo como esto:

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

Era un .jsarchivo que realmente no necesitaba transpilarse y agregarlo a la lista de ignorados ayudó.


1

Este error ocurre cuando la memoria requerida asignada para la ejecución es menor que la memoria requerida para ejecutar el proceso. De forma predeterminada, el tamaño de la memoria del nodo es de 512 mb para aumentar esto, debe escribir el siguiente comando:

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

1
¿Cuál es el nombre de archivo aquí?
— Rashedul.Rubel

1

Estaba enfrentando este problema en iónico y probé muchas soluciones, pero lo resolví ejecutando esto.

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

Para Windows: nodo --max-old-space-size = 4096 / Users / {your user} / AppData / Roaming / npm / node_modules / ionic / bin / ionic cordova build windows --prod


1
npm install -g increase-memory-limit

aumentar-límite-memoria

O

  1. Navegue a% appdata% -> carpeta npm o C:\Users\{user_name}\AppData\Roaming\npm
  2. Abra ng.cmd en su editor favorito
  3. Añadir --max_old_space_size=8192al IFy ELSEbloquear

ahora el archivo ng.cmd tiene este aspecto después del cambio:

@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

En una máquina Windows, ejecute el siguiente comando

establecer NODE_OPTIONS = - max_old_space_size = 4096



0

Cualquiera que reciba este error con las canalizaciones de compilación de Azure, intente el siguiente paso para cambiar la variable de entorno del agente de compilación

Agregue un Azure build pipeline task-> Azure powershell script:Inlinescriptantes de compilar con la siguiente configuración

- 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 en el trabajo dint de ionic-app-scripts.js

Pero después de modificar: el siguiente archivo funcionó

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

Añadiendo:

@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"% *)

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.