como ECMAScriptv5, cada vez que el control entra en un código, el enginge crea una LexicalEnvironment (LE) y un VariableEnvironment (VE), por código de función, estos 2 objetos son exactamente la misma referencia que es el resultado de llamar NewDeclarativeEnvironment (ECMAScript v5 10.4.3), y todas las variables declaradas en código de función se almacenan en el registro ambiente componentof VariableEnvironment (ECMAScript v5 10.5), y esto es el concepto básico para el cierre.Sobre el cierre, LexicalEnvironment y GC
Lo que me confunde es cómo limpieza de la memoria obras con este enfoque de cierre, supongamos que tengo un código como:
function f1() {
var o = LargeObject.fromSize('10MB');
return function() {
// here never uses o
return 'Hello world';
}
}
var f2 = f1();
después de la línea var f2 = f1()
, nuestro gráfico de objetos sería:
global -> f2 -> f2's VariableEnvironment -> f1's VariableEnvironment -> o
por lo que, según mi conocimiento, si el motor de JavaScript usa un método de recuento de referencias para recolección de basura, el objeto o
tiene ase 1 refenrence y nunca se GCed. Aparentemente, esto daría lugar a una pérdida de memoria ya que o
nunca se usaría, pero siempre se almacena en la memoria.
Alguien puede dijo que el motor sabe que de f2 VariableEnvironment no utiliza VariableEnvironment de la F1, por lo VariableEnvironment los enteros de la F1 sería GCed, por lo que no es otro fragmento de código que puede conducir a la situación más compleja:
function f1() {
var o1 = LargeObject.fromSize('10MB');
var o2 = LargeObject.fromSize('10MB');
return function() {
alert(o1);
}
}
var f2 = f1();
en este caso, f2
utiliza el objeto o1
que almacena en VariableEnvironment de la F1, por lo VariableEnvironme de f2 nt debe mantener una referencia a VariableEnvironment, lo que significa que o2
tampoco se puede convertir en GC, lo que resulta en un desperdicio de memoria.
así que preguntaría, cómo el motor javascript moderno (JScript.dll/V8/SpiderMonkey ...) maneja tal situación, ¿existe una norma estándar o está basada en la implementación, y cuál es el paso exacto del motor javascript? tal objeto gráfico al ejecutar la recolección de basura.
Gracias.
posible duplicado de [recolección de basura con node.js] (http://stackoverflow.com/questions/5326300/garbage-collection-with-node-js) – Bergi