Hablar sobre el mecanismo de recolección de basura.

Lidera a nuestro protagonista

Primero recordemos que las variables globales, el sistema liberará la memoria ocupada cuando se cierre la página, la función de variables locales, liberará la memoria cuando se ejecute la función, este es nuestro protagonista hoy: mecanismo de recolección de basura Js .

Todos los lenguajes necesitan manejar este proceso. Por ejemplo, el lenguaje C requiere que los desarrolladores apliquen y liberen manualmente la memoria

Javascript nos ayuda automáticamente con la gestión de la memoria , completando todo el ciclo de vida de la gestión de la memoria, lo que permite a los desarrolladores centrarse en la propia lógica empresarial.

Pero al mismo tiempo, también creó la ilusión de la gestión de la memoria para los desarrolladores .

Resuma este proceso :

  • Asigne la memoria que necesita
  • Usar la memoria asignada (leer, escribir)
  • Suelte \ devuélvalo cuando no sea necesario

Aquí hay dos puntos importantes de la recolección de basura:

  • Pérdida de memoria
Cuando ya no se necesita algo de memoria, por alguna razón, no se puede liberar. Provocará una pérdida de memoria , lo que provocará que la memoria del programa esté ocupada, hasta el colapso.
  • Accesibilidad
El estándar de recolección de basura es si el objeto es accesible y si se puede hacer referencia a la variable

Citar

La dirección de memoria del objeto {nombre: xxx} es referenciada dos veces por las variables a y b. Cuando a a se le asigna un valor de nulo, debido a que b todavía está siendo referenciado y accesible, no se recicla

var a = { name: "小红"};
var b = a;
a.name = "小黑";
console.log(b)
a = null;
console.log(b)
b = null; 

Cuando se test1()ejecuta, el sistema asigna memoria para obj, y cuando se ejecuta la función, se recupera la memoria.

Cuando test2()se ejecuta obj, la memoria también se abre, pero el resultado devuelto asigna obj ab, que se convierte en una variable global y no se destruirá

function test1 () {
      var obj = {}
}
​
function test2 () {
      var obj = {}
      return obj
}
​
const a = func1()
const b = func2()

Introduzca dos métodos de recolección de basura de uso común:

1. Eliminación de referencias (adoptado antes de IE9)

El número de veces que se hace referencia a la variable después de la declaración. Cuando es 0, la memoria de la variable se destruye

function test () {
      var a = {} //  a的引用计数为 0,
      var b = a // a 被 b 引用 a引用计数为 1
      let c = a // a 被 c 引用 a引用计数为 2
      b = null // b 不再引用a a的引用计数减为 1
      c = null // c不再引用a a的引用计数减为 0 被回收
}

ventaja

  • Recolecte inmediatamente la basura, cuando el valor de referencia sea 0, se recogerá inmediatamente
  • No es necesario atravesar todos los objetos activos e inactivos del montón

Desventaja

  • El mostrador debe ocupar un gran espacio, porque no se puede estimar el límite superior de cotización
  • La mayor desventaja es que no puede resolver el problema de que las referencias circulares no se pueden reciclar.
function problem(){
    var a = new Object();
    var b = new Object();
    a.test = b;
    b.test = a;
}

Los anteriores ayb se refieren entre sí, el recuento no será igual a 0, la memoria no se reciclará, las llamadas repetidas ocuparán mucha memoria

2. Dentro del motor V8 (básicamente adoptado ahora, con la marca despejada)

Es Javascriptadoptado por el motor de análisis V8 en el navegador La etapa de marcado: marcar todos los objetos activos y destruir los no marcados (es decir, los objetos inactivos).

A partir de las variables del alcance global, recorra en profundidad capa por capa a lo largo del alcance, cuando se encuentre referenciada, márquela y una vez finalizada la ejecución, la memoria de la variable que no esté marcada se destruirá.

 

 

Hablar sobre pérdidas de memoria comunes

Cuando se llama a Foo, esto apunta a una variable global (ventana), que es equivalente a una variable global, y la variable no se reciclará

function test() {
    this.test = "lala";
}
foo();

Cuando el nodo muere, el temporizador continuará ejecutándose

setInterval(function() {
    var node = document.getElementById('div');
    if(node) {
        node.innerHTML = "!。。。。。。。"
    }
}, 5000); 

Cierre

mostrador

Logra incrementos sin contaminar el entorno global. La función secundaria hace referencia a la variable de la función principal num, y num no se reciclará después de que se ejecute la función principal. Cuando se ejecuta la función secundaria, regresa a la variable de entorno global más externa add y registra el estado. Esto es en realidad memoria Caso de fugas

var add = (function () {
    var num = 0;
    return function () {
        return ++num;
    };
  })();
console.log(add());
console.log(add());
console.log(add());

Desactivar la gestión de la memoria

  • Generalmente, el almacenamiento en pila (valor del tipo básico) no se filtrará, el almacenamiento en pila (el valor del tipo de referencia es un objeto) causará pérdidas
  • Generalmente, las pequeñas fugas de memoria no afectarán el programa, pero para proyectos a gran escala, evitarán la acumulación de muy poca y desarrollarán buenos hábitos de programación.

Supongo que te gusta

Origin blog.csdn.net/GUDUzhongliang/article/details/108600091
Recomendado
Clasificación