He registrado el siguiente error de Chrome , que ha provocado muchas pérdidas de memoria graves y no obvias en mi código:
(Estos resultados utilizan el generador de perfiles de memoria de Chrome Dev Tools , que ejecuta el GC, y luego toma una instantánea del montón de todo lo que no se ha recolectado).
En el siguiente código, la someClass
instancia es recolección de basura (buena):
var someClass = function() {};
function f() {
var some = new someClass();
return function() {};
}
window.f_ = f();
Pero no se recolectará basura en este caso (malo):
var someClass = function() {};
function f() {
var some = new someClass();
function unreachable() { some; }
return function() {};
}
window.f_ = f();
Y la captura de pantalla correspondiente:
Parece que un cierre (en este caso function() {}
) mantiene todos los objetos "vivos" si cualquier otro cierre hace referencia al objeto en el mismo contexto, ya sea que ese cierre sea incluso accesible.
Mi pregunta es sobre la recolección de basura de cierre en otros navegadores (IE 9+ y Firefox). Estoy bastante familiarizado con las herramientas de webkit, como el generador de perfiles de montón de JavaScript, pero sé poco de las herramientas de otros navegadores, por lo que no he podido probar esto.
¿En cuál de estos tres casos IE9 + y Firefox recolectarán la someClass
instancia?
unreachable
función nunca se ejecuta, por lo que no se registra realmente nada.