Introducción en profundidad a la gestión de memoria Node.js

Introducción en profundidad a la gestión de memoria Node.js

"¡Un poco de espíritu impresionante, a mil millas de distancia!" **

Todos son bienvenidos a prestar atención a mi cuenta pública "horas de atención al público", ¡los artículos se envían sincrónicamente!

Inserte la descripción de la imagen aquí

01 Prefacio

Con el desarrollo de Node, el funcionamiento de JavaScript ya no se limita a ejecutarse en el navegador, sino que la aplicación de Node en el servidor hace aparecer cada vez más problemas. Para los desarrolladores que son nuevos en JavaScript, rara vez piensan en la asignación de memoria o pérdidas de memoria. Para mantenerse al día con la tendencia, explique cómo Node usa la memoria de manera razonable y eficiente para evitar pérdidas de memoria.

02 Recolección de basura V8 y limitación de memoria

La programación de JavaScript no necesita preocuparse por la asignación y liberación de memoria, ya que tiene un mecanismo de recolección de basura para administrar. Pero nuestra comprensión más profunda de la administración de memoria es muy pequeña: ¿cómo se asigna la memoria y cómo funciona la recolección de basura?

01 Nodo YV8

Primero entendamos cuál es la relación entre los dos. En primer lugar, V8 es un motor de navegador desarrollado por Google. Su rendimiento es excelente, lo que permite escribir programas de servidor en JavaScript. El origen de V8 fue desarrollado por el experto en máquinas virtuales Lars Bak. El trabajo previo de los desarrolladores se ha centrado en el desarrollo de máquinas virtuales de alto rendimiento.

Node es una plataforma de tiempo de ejecución de JavaScript creada en Chrome. A partir de esto, el alto rendimiento de Node es como sostener el muslo de V8, y puede disfrutar de un mejor rendimiento a medida que se actualiza V8.

02 límite de memoria V8

Node tiene restricciones sobre el uso de memoria a través de JavaScript, y Node no puede manipular directamente objetos de memoria grandes. Tiene aproximadamente 1,4 GB en un sistema de 64 bits y aproximadamente 0,7 GB en un sistema de 32 bits. La razón es que Node se basa en V8, y su asignación y administración de memoria están controladas por V8. Aunque no hay ningún problema con este mecanismo de asignación bajo el navegador, es problemático en Node.

03 Asignación de objetos de V8

En V8, todos los objetos de JavaScript se asignan a través del montón, y la cantidad de espacio de memoria ocupada por los objetos es incierta.
Inserte la descripción de la imagen aquí

Cuando escribimos algunas variables en el código, lo aplicaremos al espacio de memoria en el montón. Dijimos anteriormente que V8 tiene un límite de asignación de memoria, que se debe al impacto del mecanismo de recolección de basura de V8. Imaginemos que si hay 1.5GB de basura esperando ser recolectada, y el mecanismo de recolección de basura V8 necesita ejecutarse cada 50 milisegundos o más, durante este tiempo, el programa no se ejecutará.

Si se dice que tengo que activar esta restricción, podemos cambiar los parámetros cuando se inicia Node:

node --max-old-space-size=1700   xxx.js    //单位是MB
node --max-new-space-size=1024  xxx.js    //单位是KB

El significado del código anterior es el cambio del espacio Cenozoico y Cenozoico, y más adelante explicaré qué es el espacio Cenozoico y Cenozoico.

04 V8 mecanismo de recolección de basura

En V8, sabemos que el espacio de memoria se puede dividir en nueva generación y generación anterior. El espacio Cenozoico almacena principalmente algunos objetos con un tiempo de supervivencia corto, mientras que el espacio Cenozoico almacena principalmente algunos objetos con un tiempo de supervivencia prolongado.

Dije que los sistemas de 64 bits solo pueden usar aproximadamente 1.4 GB, los sistemas de 32 bits solo pueden usar 0.7 GB. Este espacio contiene el espacio de las generaciones jóvenes y viejas, y la vieja generación tiene más espacio que la nueva generación.
Inserte la descripción de la imagen aquí

Rango 32 64 Lugar
Cenozoico 16MB 32MB
Mesozoico 700MB 1400MB

V8 utiliza principalmente dos algoritmos diferentes, actuando sobre las generaciones jóvenes y viejas, porque la relación entre los dos es diferente. Existen principalmente algoritmos de clase, el primero es el algoritmo Scavenge y el segundo es Mark-Sweep & Mark-Compact. Las características de las nuevas y viejas generaciones son las siguientes:

Nueva generación: menos objetos supervivientes

Vieja generación: más objetos supervivientes

① algoritmo Scavenge

  • Divide el espacio de la nueva generación en dos, del espacio al espacio.
  • La memoria se asigna primero al espacio From y la recolección de basura verifica la supervivencia del espacio From
  • Mueva el objeto superviviente del espacio Desde al espacio Hasta y suelte el espacio Desde
  • Intercambiar desde y hacia espacios

Esto completa un proceso de limpieza para la recolección de basura.
Inserte la descripción de la imagen aquí

② Algoritmo Mark-Sweep

  • Atraviesa todos los objetos en el montón, marca los objetos vivos
  • Borrar objetos sin marcar
    Inserte la descripción de la imagen aquí

Debido a que hay muchos objetos supervivientes en el espacio de la generación anterior, el tiempo de recorrido será relativamente largo cuando se usa el algoritmo Scavenge, y la mitad del espacio se desperdiciará para almacenar los objetos, lo cual es relativamente ineficiente. En general, el algoritmo Scavenge copia objetos vivos , mientras que el algoritmo Mark-Sweep limpia objetos muertos .

③ Algoritmo Mark-Compact

Vemos que el algoritmo anterior genera espacio de memoria fragmentado después de una recuperación . Si un objeto de memoria grande entra en este momento, la asignación no puede completarse, y se activa de antemano una nueva ronda de mecanismo de recolección de basura. Por lo tanto, en base a este problema, sobre la base del algoritmo original, se adopta el método de compresión , y durante el proceso de marcar el objeto vivo, el objeto se moverá hacia un lado. Luego, borre la memoria de límites directamente después de completar el marcado.
Inserte la descripción de la imagen aquí

④ Algoritmo de marcado incremental

A diferencia de los tres anteriores, este algoritmo ** adopta un método de "paso a paso" , porque el mecanismo de recolección de basura se ejecuta una vez, y para el tiempo de ejecución del mecanismo de recolección de basura es demasiado largo, entonces la página La lógica de la aplicación debe detenerse y esperar, este impacto también es relativamente grande.

No hay necesidad de preocuparse por este problema para la generación joven, porque la generación joven tiene menos objetos supervivientes y la huella de memoria es relativamente pequeña. Sin embargo, para la generación anterior, hay más y más objetos , y el impacto de la pausa es grande, por lo que es necesario que la lógica de la aplicación se vea menos afectada por la recolección de basura.

Por lo tanto, se adopta el método "paso a paso", y el mecanismo de recolección de basura y el código lógico ** ejecución segmentada ** se utilizan para aliviar el problema de que la lógica de la aplicación no se puede ejecutar debido al largo tiempo de pausa.
Inserte la descripción de la imagen aquí

03 Resumen

Node extiende la aplicación principal de JavaScript al lado del servidor, por lo que los detalles que consideramos también son diferentes de los navegadores. Se trata más de la asignación de recursos de memoria. Un poco de descuido puede escribir algunas pérdidas de memoria, haciendo El mecanismo de recolección de basura no puede limpiar y liberar memoria, lo que puede causar que el servidor se bloquee.

Por lo tanto, generalmente debemos ser más cuidadosos al escribir código, no escribir variables globales o usar cierres con frecuencia, estos también causarán pérdidas de memoria si la memoria no se libera correctamente.

Artículo de referencia:

  • Una explicación simple de Node.js
    Inserte la descripción de la imagen aquí
Publicado 57 artículos originales · ganado elogios 6 · vistas 6419

Supongo que te gusta

Origin blog.csdn.net/weixin_42724176/article/details/104811148
Recomendado
Clasificación