recolector memoria liberar leaks ejemplo collector basura javascript memory-leaks garbage-collection circular-reference

memoria - Referencias circulares en Javascript/Recolector de basura



liberar memoria javascript (1)

¿Alguien puede explicar en detalle cómo los motores Javascript manejan las referencias circulares? ¿Hay una gran diferencia entre los navegadores o incluso node.js?

De lo que estoy hablando es de una referencia atrás / siguiente explícita dentro de los objetos. Por ejemplo:

var objA = { prop: "foo", next: null }; var objB = { prop: "foo", prev: null }; objA.next = objB; objB.prev = objA;

Aquí vamos. Si hacemos un console.log( objA ) podemos ver que creamos una cadena infinita. La gran pregunta es, ¿esto es malo? ¿Crea fugas de memoria cuando no se limpian explícitamente?

Entonces tenemos que

objA.next = null; objB.prev = null;

¿O los recolectores de basura nos cuidarán en constelaciones como esta?


Cualquier recolector de basura medio decente manejará los ciclos.

Los ciclos son solo un problema si haces conteo de referencias ingenuo.

La mayoría de los recolectores de basura no hacen recuento de ref (tanto porque no puede manejar ciclos, como porque es ineficiente). En su lugar, simplemente siguen cada referencia que pueden encontrar, comenzando desde "raíces" (típicamente variables globales y basadas en la pila), y marcan todo lo que pueden encontrar como "alcanzable".

Entonces simplemente reclaman el resto de la memoria.

Los ciclos no son un problema porque solo significa que se alcanzará el mismo nodo varias veces. Después de la primera vez, el nodo ya estará marcado como "alcanzable", por lo que el GC sabrá que ya ha estado allí y se saltará el nodo.

Incluso los GC más primitivos basados ​​en recuento de referencias implementan típicamente algoritmos para detectar y romper ciclos.

En resumen, no es algo de lo que deba preocuparse. Me parece recordar que Javascript GC de IE6 realmente no pudo manejar los ciclos (podría estar equivocado, ha pasado un tiempo desde que lo leí, y ha pasado mucho, mucho más tiempo desde que toqué IE6), pero en cualquier implementación moderna, no es problema.

El punto entero en un recolector de basura es abstraer la gestión de la memoria. Si tiene que hacer esto usted mismo, su GC está roto.

Consulte MDN para obtener más información sobre la recolección de basura moderna y los algoritmos de marcaje y barrido que se utilizan.