node.js

Node.js "ERROR FATAL: Fallo en la asignación JS-proceso sin memoria"-¿es posible obtener un seguimiento de la pila?



(12)

¿Podría ser un problema de recursión en un objeto que está serializando, que es simplemente grande para empezar, y se queda sin memoria antes de que la recursión se convierta en un problema?

Creé el módulo npm safe-clone-deep por esta razón ... básicamente querrás hacer lo siguiente.

var clone = require(''safe-clone-deep''); ... return JSON.stringify(clone(originalObject));

Esto te permitirá clonar casi cualquier objeto que luego se serializará de forma segura. Además, si uno de los objetos se hereda de Error , serializará el name heredado, el message y las propiedades de la stack , ya que estos normalmente no se serializan.

Bueno ... he vuelto al punto uno. No puedo entender esto por mi vida.

Me aparece el siguiente error:

FATAL ERROR: JS Allocation failed - process out of memory

Podría enumerar las docenas (sí, docenas) de cosas que he tratado de llegar a la raíz de este problema, pero en realidad sería demasiado. Así que aquí están los puntos clave:

  • Solo puedo hacer que suceda en mi servidor de producción, y mi aplicación es grande y complicada, por lo que está resultando muy difícil de aislar
  • Sucede a pesar de que el tamaño del almacenamiento dinámico y el tamaño de RSS son ambos <200 Mb, lo que no debería ser un problema, dado que las máquinas (Amazon Cloud, CentOS, m1.large) tienen 8 GB de RAM.

Mi suposición es que (debido al segundo punto), una fuga probablemente no sea la causa; más bien, parece que probablemente haya un objeto ÚNICO que sea muy grande. El siguiente hilo hace una copia de seguridad de esta teoría :: En Node.js usando JSON.stringify resulta en un error de ''proceso sin memoria''

Lo que realmente necesito es alguna forma de averiguar cuál es el estado de la memoria en el momento en que falla la aplicación, o tal vez un rastro de pila que conduzca al ERROR FATAL.

Basado en mi suposición anterior, un volcado de almacenamiento de 10 minutos de antigüedad es insuficiente (ya que el objeto no habría residido en la memoria).


Al usar npm 5.0.3 en una instancia de AWS, tuvimos problemas de permisos en la carpeta global npm, lo que probablemente haya provocado que esto nos suceda. sudo chown -R $(whoami) $(npm config get prefix)/{lib/node_modules,bin,share} : sudo chown -R $(whoami) $(npm config get prefix)/{lib/node_modules,bin,share} ahora funciona bien


Analizando una cantidad de casos, el problema más común es el de un bucle infinito. ¡Esto sería difícil de resolver en una aplicación compleja, ahí es donde el desarrollo impulsado por pruebas es útil!


Compartiendo lo que sucede aquí:

Perdí algunos días con este problema, hasta que encontré que en algún archivo estaba importando una clase de un archivo estático, un archivo incorporado. Hace que el proceso de compilación nunca termine. Algo como:

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

La reparación de la fuente real resolvió todo el problema.


En mi caso, estaba implementando Rails 4.2.1 a través del despliegue de producción de mayúsculas (capistrano) y durante la precompilación de activos recibida:

rake stdout: rake abortado! ExecJS :: RuntimeError: FATAL ERROR: Asignación de evacuación fallida - proceso sin memoria (execjs): 1

Había ejecutado una docena de importaciones de datos a través de active_admin antes y parece que ha agotado toda la memoria RAM

Solución: el reinicio y la implementación del servidor se ejecutaron por primera vez ...


En mi caso, había inicializado una matriz asociativa (Object) usando []. Tan pronto como lo inicié como {} el problema desapareció.


En mi caso, un archivo que estaba usando para generar el db durante el desarrollo estaba causando la fuga. Por alguna razón, al nodo no le gustó un comentario de varias líneas que tenía al final del archivo. No veo nada de malo en ello, pero un proceso de eliminación significa que sé que es esta sección de este archivo.



Pasé algunos días para llegar a la causa raíz del problema. El error "JS - proceso sin memoria" comenzó a producirse durante la creación del paquete web solo en la instancia de AWS EC2. Sin embargo, la construcción fue exitosa en mi sistema local.
El motivo fue el siguiente código:
Anterior:
import { ShoppingCartOutlined } from "@material-ui/icons/ShoppingCartOutlined";
Fue arreglado por:
import ShoppingCartOutlined from "@material-ui/icons/ShoppingCartOutlined";

Puede ayudar a alguien a usar material-ui / icons y termina con este error.


Solo porque esta es la respuesta principal en Google en este momento, pensé que agregaría una solución para un caso que acabo de encontrar:

Tuve este problema al usar Express con plantillas ejs. El problema fue que no pude cerrar un bloque de ejs, y el archivo era código js, ​​algo como esto:

var url = ''<%=getUrl("/some/url")'' /* lots more javascript that ejs tries to parse in memory apparently */

Este es obviamente un caso súper específico, la solución de OP debe usarse la mayoría de las veces. Sin embargo, la solución de OP no funcionaría para esto (la huella de la pila ejs no será mostrada por ofe ).


Tengo que dar enormes apoyos a Trevor Norris en este caso para ayudar a modificar node.js en sí mismo de manera que generará automáticamente un volcado de pila cuando se produzca este error.

En última instancia, lo que resolvió este problema para mí, sin embargo, fue mucho más mundano. Escribí un código simple que adjuntó el punto final de cada solicitud de API entrante a un archivo de registro. Esperé a reunir ~ 10 puntos de datos (bloqueos) y comparé los puntos finales que se habían ejecutado 60 segundos antes del accidente. Encontré eso en 9 de 10 casos, un solo punto final que había sido golpeado justo antes del accidente.

A partir de ahí, solo fue cuestión de profundizar en el código. Lo reduje todo, devolviendo menos datos de mis consultas de mongoDB, pasando solo los datos necesarios de un objeto a la devolución de llamada, etc. Ahora hemos avanzado 6 veces más que el promedio sin un solo bloqueo en ninguno de los servidores, lo que me llevó a Espero que esté resuelto ... por ahora.


No hay una solución única para este problema.
Leí diferentes casos, la mayoría de ellos relacionados con JS, pero en mi caso, por ejemplo, era solo un bucle roto de plantilla de jade que era infinito debido a una falla en el código.

Supongo que es solo un error de sintaxis que el nodo no administra bien.
Verifique su código o publíquelo para encontrar el problema.