Cómo el motor V8 recupera la memoria y cómo optimizar

Memoria

Razones para prestar atención a la memoria:

  • Para evitar que la página ocupe demasiado contenido y provoque que el cliente se congele, Shenzhen no responde
  • Node usa v8. Debido a la persistencia del servidor, el backend puede fácilmente causar un desbordamiento de memoria

Tamaño de la memoria

  • El sistema operativo es de 64 bits, el tamaño de la memoria es de 1,4 G, el espacio de nueva generación de 64 bits es de 64 MB, la generación anterior es de 1400 MB
  • El sistema operativo es 0.7G para 32 bits, el espacio de nueva generación de 32 bits es 16MB y la generación anterior es 700MB.
    Inserte la descripción de la imagen aquí
    ¿Por qué no expandir la memoria?
    En primer lugar, la característica del front end es que no es persistente y se recicla completamente una vez que se ejecuta. En términos generales, 1.4G es suficiente. En segundo lugar, JS suspenderá la ejecución cuando se recicla la memoria. Esto provocará una pausa, cuanto mayor sea la memoria, mayor será la pausa.

¿Cuál es el significado y la relación de la nueva generación y la vieja generación?

La comprensión simple de la nueva generación es copiar, y la generación anterior es eliminar y organizar.

La generación joven se utiliza para almacenar las variables recién generadas. La generación anterior es la nueva generación. Las variables de la nueva generación se colocarán en la generación anterior solo cuando cumplan ciertas condiciones. (Las condiciones se discutirán más adelante)

Las variables pequeñas y nuevas se colocan primero en el espacio from para una recuperación, y las variables que sobreviven después de la recuperación se colocan en el espacio to, y luego se vacía el from; cuando la recuperación ocurre nuevamente, las funciones from y to se intercambian.

¿Por qué dividir desde y hacia?
Esto es para sacrificar espacio a cambio de tiempo.

En la generación anterior, los marcados en negro deben eliminarse, y después del reciclaje, la memoria debe organizarse en continuos para un uso fácil. (Por ejemplo, la matriz debe tener espacio de memoria continuo)
Inserte la descripción de la imagen aquí¿Cuáles son los requisitos para la promoción de la nueva generación a la generación anterior?

Hay dos métodos:

  1. Las variables que se han recuperado dos veces después de recuperarse de la generación joven se pueden colocar en la generación anterior
  2. La memoria ocupada es demasiado grande, o To ha utilizado el 25% del espacio (el sistema de 64 bits es 8 MB), entonces ingresará directamente a la generación anterior.
    Inserte la descripción de la imagen aquí

Cómo verificar la memoria

Método 1:
Ingrese window.performanceo resuma utilizando el
navegador de Memoria en la consola del navegador :
Inserte la descripción de la imagen aquío
Inserte la descripción de la imagen aquíMétodo 2:
Puede process.messoryUsage()verificar el estado de la memoria en el entorno Nodo
Inserte la descripción de la imagen aquí

externo es memoria adicional, que es memoria de C ++. Dado que el nodo está escrito en C ++, tiene el poder de asignar memoria de C ++, por lo que puede expandirse, pero solo en el entorno Node.

Método tres: a través del código js

function getMe() {
    var men = process.memoryUsage()
    return men
}
console.log(getMe())

La conversión al formato MB es más intuitiva

function getMe() {
    var men = process.memoryUsage();
    var format = function(bytes){
        return (bytes/1024/1024).toFixed(2)+"MB"
    }
    console.log(format(men.heapTotal))
}
getMe() 

Manejo variable

La memoria son principalmente las
variables locales que almacenan variables y otros datos. Cuando finaliza la ejecución del programa y no hay referencia, se puede limpiar, pero no se recupera de inmediato y debe esperar.
Los objetos globales siempre se ejecutarán hasta el final del programa, y ​​se pueden liberar asignando variables indefinidas o nulas a las globales.

Consejos de optimización de memoria

  1. Intente no definir variables globales y destrúyalas a tiempo (asignadas indefinidas o nulas)
  2. Función de ejecución automática anónima(function(){})()
  3. Intente evitar referencias a cierres de montón

Prevenir pérdidas de memoria

  1. Prevenir el abuso de memoria
  2. Presta atención al funcionamiento de la memoria grande.

El caché generalmente es global, porque para garantizar que el programa esté activo, se recomienda agregar un bloqueo antes del caché V8, es decir, para determinar la longitud de la matriz de datos almacenados, si la longitud ha alcanzado el límite, cambie los datos, según el primero en entrar, primero en salir Forma de eliminar datos anteriores, presione para almacenar datos posteriores.

Operaciones de memoria grande: por ejemplo, los archivos
pequeños del nodo de procesamiento de archivos pueden usar
el procesamiento de archivos grandes del nodo fs.readFile () puede usar createReadStream (). Pipe (write)
js puede usar el método de carga de corte para cargar archivos grandes (corte)

Resumen final

Para aprender cómo el motor V8 recupera la memoria, debe comprender cómo el motor V8 asigna memoria, comprender el manejo de variables, las técnicas de optimización de memoria y evitar pérdidas de memoria.

Inserte la descripción de la imagen aquí

El contenido anterior es una nota resumida después de un video de aprendizaje sobre la recuperación de memoria del motor V8

128 artículos originales publicados · 52 elogios · 20,000+ vistas

Supongo que te gusta

Origin blog.csdn.net/weixin_44523860/article/details/105351255
Recomendado
Clasificación