Recolección de basura JavaScript

JavaScript tiene un mecanismo automático de recolección de basura, y el entorno de ejecución es responsable de administrar la memoria utilizada durante la ejecución del código. El principio del mecanismo de recolección de basura: descubra las variables que ya no se usan y luego libere la memoria que ocupan. Para este fin, el recolector de basura realizará periódicamente esta operación de acuerdo con un tiempo fijo (o tiempo de recolección programado durante la ejecución del código).

Ciclo de vida normal de las variables locales.

Las variables locales solo existen durante la ejecución de la función. En este proceso, a las variables locales se les asignará el espacio correspondiente en la memoria de la pila (o montón) para almacenar sus valores. Luego use estas variables en la función hasta el final de la ejecución de la función. En este punto, las variables locales no son necesarias, por lo que pueden liberar su memoria para uso futuro. No todos los casos son tan fáciles de sacar conclusiones.

La recolección de basura debe rastrear qué variables son útiles y cuáles son inútiles, y marcar las variables que ya no son útiles para recuperar la memoria que ocuparán en el futuro. Las estrategias utilizadas para identificar variables inútiles pueden variar de una implementación a otra, y generalmente hay dos estrategias.

Marca clara

Un método común de recolección de basura es la eliminación de marcas. Cuando una variable ingresa al entorno (por ejemplo: declarar una variable en una función), la variable se marca como "ingresando al entorno". Lógicamente hablando, la memoria ocupada por las variables que ingresan al entorno nunca se puede liberar, porque siempre que el flujo de ejecución ingrese al entorno correspondiente, se pueden usar. Cuando la variable abandona el entorno, se marca como "Abandonar el entorno"

Las variables se pueden marcar de cualquier manera. Por ejemplo, puede voltear un bit especial para registrar cuando una variable ingresa al entorno, o usar una lista variable de "ingresar al entorno" y una lista variable de "abandonar el entorno" para rastrear qué variable ha cambiado.

Cuando se ejecuta el recolector de basura, se marcan todas las variables almacenadas en la memoria. Luego eliminará las variables en el entorno y las variables a las que hacen referencia las únicas variables de culpa del entorno, porque las variables en el entorno ya no pueden acceder a estas variables, y finalmente, el recolector de basura completa el trabajo de limpieza de memoria, destruyendo los valores marcados Y reclamar el espacio de memoria que ocupan.

Recuento de referencias

Significado: Rastrea el número de veces que se cita cada valor.
Cuando se declara una variable y se asigna un valor de tipo de referencia a la variable, el número de citas es 1.
Si se asigna el mismo valor a una variable, el número de citas aumenta en 1. Por el contrario, si contiene Si la variable referenciada de valor tiene otro valor, el número de citas se reduce en 1. Cuando el número de citas se convierte en 0, significa que no hay forma de acceder al valor, por lo que se puede recuperar el espacio de memoria ocupado por él. . De esta manera, cuando el recolector de basura se ejecute la próxima vez, liberará la memoria ocupada por el valor con cero tiempos de referencia.
Ejemplo:

fnction problem(){
	var objectA = new Object();
	var objectB = new Object();
	objectA.someone = objectB;
	objectB.someone = objectA;
}

objectA y objectB interactúan a través de sus respectivos atributos, y el número de citas es 2.
La marca se borra, porque después de que se ejecuta la función, estos dos objetos han salido del alcance, por lo que esta referencia mutua no es un problema. Pero el recuento de referencias, cuando se ejecuta la función, objectA, objectB continuará existiendo, porque su recuento de referencias nunca es 0. Si se llama a esta función repetidamente, hará que no se recicle mucha memoria.

Para evitar problemas de referencia circulares como este, es mejor desconectar manualmente la conexión entre el objeto JavaScript nativo y el elemento DOM cuando no se usan. Puede usar el siguiente código para eliminar referencias circulares:
objectA.someone = null; objectB.someone = null;
establecer la variable en null significa cortar la conexión entre la variable y el valor al que hace referencia anteriormente. La próxima vez que se ejecute el recolector de basura, eliminará estos valores y recuperará la memoria que ocupan.
Para resolver los problemas anteriores, IE9 convierte los objetos BOM y DOM en objetos JavaScript reales. Esto evita los problemas causados ​​por la coexistencia de los dos algoritmos de recolección de basura y también elimina el fenómeno común de pérdida de memoria.

17 artículos originales publicados · elogiados 0 · visitas 767

Supongo que te gusta

Origin blog.csdn.net/CandiceYu/article/details/89888752
Recomendado
Clasificación