Desbordamiento de memoria de nodejs ERROR FATAL: CALL_AND_RETRY_0 Error de asignación: proceso sin memoria (reproducido)

Nodejs Memory Overflow Fatal Error

Error de desbordamiento de memoria de Nodejs ERROR FATAL: CALL_AND_RETRY_0 Error de asignación: proceso sin memoria

1-12

Informar un error



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



Cuando estaba usando la cola, ejecuté una matriz grande y, a menudo, reporté un desbordamiento de memoria en el medio de la ejecución.



Revisé algunas soluciones, resuélvalas temporalmente así

Puede aumentar los límites predeterminados pasando --max-old-space-size= que está en MB.

El ejemplo permitirá el uso del montón del nodo hasta 4 GB (4096 megabytes ) de memoria:



|_+_|

Problema similar
http://stackoverflow.com/questions/7357339/nodejs-out-of-memory
http://cnodejs.org/topic/500904be4764b72902d30f4d
http://www.360doc.com/content/14/0903/22/11644963_406872841.shtml

Solución de análisis Yunqi
https://yq.aliyun.com/articles/4050

solución
http://stackoverflow.com/questions/7357339/nodejs-out-of-memory
http://www.tuicool.com/articles/miU3e2
http://www.360doc.com/content/14/0903/22/11644963_406872841.shtml

original https://segmentfault.com/a/1190000004934938 tema Node.js Pérdida de memoria

Como dijo Pu Ling, Node es muy sensible a las pérdidas de memoria. Una vez que las aplicaciones en línea tienen miles de tráfico, incluso un byte de pérdida de memoria provocará acumulación y el proceso de recolección de basura llevará más tiempo. Exploración de objetos, la aplicación responde lentamente, hasta que la memoria del proceso se desborda, la aplicación se bloquea.

Aunque se sabe desde hace mucho tiempo que los problemas de memoria no se pueden ignorar, no existe un cuello de botella en el rendimiento durante el desarrollo diario. Hasta hace poco, se realizó un proyecto de marketing a nivel de un millón de PV. Debido al número de visitas, el volumen simultáneo alcanzó una. Magnitud. Se magnificaron algunos problemas pequeños e imperceptibles, y luego aparecieron y comenzaron a notar problemas de memoria. Poco sabe que Node es tan sensible a las pérdidas de memoria.

Con este fin, me apresuré a aprender sobre el mecanismo de procesamiento de memoria en V8.

Entonces, ¿cuál es el mecanismo de memoria en V8?

Mecanismo de memoria del V8

Limite de memoria

A diferencia de otros lenguajes de back-end, Node no tiene muchas restricciones sobre el uso de la memoria. Cuando se usa memoria en Node, solo se puede usar una parte de la memoria del sistema. Tiene aproximadamente 1,4 GB para un sistema de 64 bits y 0,7 GB para un sistema de 32 bits. Esto se debe al uso de Node del motor V8 que se ejecutaba originalmente en el navegador.

El motor V8 fue diseñado para ejecutarse en el navegador al principio, pero es más que suficiente para usar en los escenarios de aplicaciones generales del navegador, y es suficiente para cumplir con todos los requisitos en la página de inicio.

Aunque el funcionamiento del lado del servidor de gran memoria no es un requisito común, si existe tal requisito, la restricción puede levantarse. Al iniciar el programa de nodo, puede pasar dos parámetros para ajustar el tamaño del límite de memoria.

|_+_|

Estos dos comandos corresponden a la `` nueva generación '' y la `` generación anterior '' en el montón de memoria del nodo respectivamente

Casos especiales no limitados por la memoria

En Node, el uso de Buffer puede leer archivos grandes que exceden el límite de memoria de V8. La razón es que el objeto Buffer es diferente de otros objetos en que no pasa por el mecanismo de asignación de memoria V8. Este es el escenario de aplicación de Node y diferente del navegador. En el navegador, JavaScript puede procesar cadenas directamente para satisfacer la mayoría de las necesidades comerciales, mientras que Node necesita procesar flujos de red y flujos de E / S de archivos. Las cadenas de funcionamiento están lejos de cumplir con los requisitos de rendimiento de la transmisión.

Asignación de memoria

Todos los objetos de JavaScript se almacenan en el montón

Cuando declaramos una variable y asignamos un valor en el código, la memoria del objeto utilizado se asigna en el montón. Si la memoria libre asignada no es suficiente para asignar nuevos objetos, continúe solicitando memoria de pila hasta que el tamaño de pila supere el límite de V8.

01

Mecanismo de recolección de basura de V8

Recolección de basura generacional

La estrategia de recolección de basura de V8 se basa principalmente en el 'mecanismo de recolección de basura generacional'. Basado en este mecanismo, V8 divide la memoria en 'Espacio Nuevo' y 'Espacio Antiguo'.

Los objetos de la generación joven son objetos con un tiempo de supervivencia más corto, y los objetos de la generación anterior son objetos con un tiempo de supervivencia más largo o memoria permanente.

Mencionado anteriormente node --max-nex-space-size=1024 app.js // The unit is KB node --max-old-space-size=2000 app.js // The unit is MB El comando es establecer el espacio de memoria máximo de la generación anterior, y --max-old-space-size El comando puede establecer el tamaño del espacio de memoria de nueva generación.

02

¿Por qué se divide en dos generaciones?

Hay muchos tipos de algoritmos de recolección de basura, pero ninguno es adecuado para todos los escenarios. En aplicaciones reales, es necesario utilizar diferentes algoritmos de acuerdo con el ciclo de vida de los objetos para lograr los mejores resultados. En V8, la recolección de basura de la memoria se divide en diferentes generaciones de acuerdo con el tiempo de supervivencia del objeto, y luego se aplican algoritmos más eficientes a diferentes memorias.

Recolección de basura en la nueva generación

En la nueva generación, principalmente a través Hurgar Algoritmo para recolección de basura.

Hurgar

En el algoritmo Scavenge, divide la memoria del montón en dos, y cada parte del espacio se llama semiespacio. De los dos espacios semiespacios, solo uno está en uso y el otro está inactivo. El semispacio que está en uso se llama espacio Desde y el semispacio que está inactivo se llama espacio Hasta. Cuando asignamos objetos, primero los asignamos desde el espacio Desde. Cuando comience la recolección de basura, se verificarán los objetos supervivientes en el espacio Desde. Estos objetos supervivientes se copiarán en el espacio A y se liberará el espacio ocupado por los objetos no supervivientes. Una vez completada la copia, se intercambian los roles de Desde el espacio y Hasta el espacio. En resumen, en el proceso de recolección de basura, los objetos vivos se copian entre dos espacios semiespacios.

03

¿Cómo pueden los objetos de la generación joven llegar a la generación anterior?

Los objetos con un período de supervivencia prolongado en la generación joven se trasladarán a la generación anterior, que principalmente cumple una de dos condiciones:

1. Si el sujeto ha experimentado la recuperación de Scavenge.

Cuando un objeto se copia del espacio Desde al espacio Hasta, verificará su dirección de memoria para determinar si el objeto ha sido objeto de una colección Scavenge. Si ha sido así, el objeto se copiará del espacio Desde al espacio de la generación anterior.

2. La relación de memoria del espacio A supera el límite del 25%.

Cuando un objeto se copia del espacio Desde al espacio Hasta, si el espacio Hasta se ha utilizado más del 25%, el objeto se copia directamente a la generación anterior. La razón de esto es que una vez completada la recuperación de Scavenge, el espacio Hasta se convertirá en el espacio Desde y la siguiente asignación de memoria se realizará en este espacio. Si la proporción es demasiado alta, la asignación de memoria posterior se verá afectada.

Recolección de basura en la vieja generación

Para los objetos de la vieja generación, dado que los objetos supervivientes representan una gran proporción, es obvio que no es científico utilizar el algoritmo Scavenge. En primer lugar, copiar demasiados objetos provocará problemas de eficiencia y, en segundo lugar, desperdiciará el doble de espacio. Por lo tanto, en la generación anterior, V8 utiliza principalmente la combinación del algoritmo 'Mark-Sweep' y el algoritmo 'Mark-Compact' para la recolección de basura.

Marca de barrido

Mark-Sweep significa limpieza de marcas, que se divide en dos etapas: marca y limpieza. En la fase de marcado, se atraviesan todos los objetos del montón y se marcan los objetos supervivientes. En la siguiente fase de limpieza, solo se eliminan los objetos fuera de la marca.

04

Pero Mark-Sweep tiene un problema muy serio, es decir, después de un barrido y reciclaje de marcas, la memoria se fragmentará. Si es necesario asignar un objeto grande, la asignación no se puede completar en este momento. Es hora de que Mark-Compact juegue.

Mark-Compact

Mark-Compact significa acabado de marcas, que evolucionó sobre la base de Mark-Sweep. Después de que Mark-Compact marca los objetos supervivientes, mueve los objetos supervivientes a un extremo durante el proceso de clasificación. Una vez completado el movimiento, borra directamente la memoria fuera del límite.

05

Marcado incremental

En vista de la naturaleza de un solo subproceso de Node, V8 necesita pausar la lógica de la aplicación cada vez que se recolecta la basura y reanudar la lógica de la aplicación después de que se ejecuta la recolección de basura, lo que se denomina 'pausa completa'. En la recolección de basura generacional, una pequeña recolección de basura solo recolecta a la generación joven, y hay relativamente pocos objetos sobrevivientes, incluso si está completamente detenido, no tendrá mucho impacto. Sin embargo, en la generación anterior, hay muchos objetos que sobreviven, y el marcado, la limpieza y la clasificación de la recolección de basura requieren una pausa prolongada, lo que afectará seriamente el rendimiento del sistema. Entonces se propuso el 'Marcado incremental'. Comienza desde la etapa de marcado y cambia la acción que originalmente debía completarse en un alto a un marcado incremental, y lo divide en muchos 'pasos' pequeños. Después de cada 'paso', la lógica de la aplicación JavaScript se ejecuta durante un breve período de tiempo. La lógica de reciclaje y aplicación se ejecutan alternativamente de esta manera hasta que se completa la fase de marcado.

Herramientas de solución de problemas de fugas de memoria

node-heapdump

Permite tomar instantáneas de la memoria del montón V8 para análisis post-mortem. Introducir en el programa

|_+_|

Después de eso, puede enviar una señal SIGUSR2 al servidor para permitir que node-heapdump tome una instantánea de la memoria del montón:

|_+_|

Esta instantánea se almacenará en el directorio de archivos de forma predeterminada. Este es un archivo JSON de gran tamaño que se puede abrir y ver a través de las herramientas de desarrollo de Chrome.

06

node-memwatch

Cabe señalar que node-memwatch solo admite hasta el nodo v0.12.x. Cuando utilice una versión superior, no se instalará. Puedes usarlo nodo-ver-siguiente Alternativa, exactamente la misma API.

A diferencia de node-heapdump, proporciona dos detectores de eventos para proporcionar información sobre fugas de memoria y recolección de basura:

  1. Evento de estadísticas: cada vez que se realiza una recopilación de pila completa, se cambiará la hora y se transmitirán las estadísticas de la memoria

  2. Evento de fuga: después de cinco recolecciones de basura, si la memoria aún no se libera, se activará el evento de fuga para transferir información relevante.

perfiles de nodo

node-profiler es una herramienta similar a node-heapdump para capturar instantáneas del montón de memoria producidas por el equipo de alinode. La diferencia es que la implementación de node-profiler es diferente y es más conveniente de usar. Adjunta su tutorial: Cómo usar Node Profiler

alinodo

El funcionario Alinode dijo:

Alinode es una solución de servicio de aplicaciones Node.js producida por Alibaba Cloud. Es un conjunto de entorno de ejecución y plataforma de servicios mejorados en función de la comunidad Node. Sobre la base de la comunidad, hemos creado una potente función de soporte para ayudar a los desarrolladores a comprender rápidamente los detalles del rendimiento, localizar rápidamente enfermedades intratables y explorar directamente la raíz del problema.

El contenido anterior se hace referencia a

Un recorrido por V8: recolección de basura

V8 Journey: recolector de basura

'Introducción a Node.js'

Los derechos de autor pertenecen a: SETPHP

Direccion original: http://www.setphp.com/930.html