Registrei o seguinte bug do Chrome , o que levou a muitos vazamentos de memória sérios e não óbvios no meu código:
(Esses resultados usam o criador de perfil de memória das Ferramentas de Desenvolvimento do Chrome , que executa o GC e, em seguida, tira um instantâneo de tudo o que não é coletado em lixo.)
No código abaixo, a someClass
instância é coletada como lixo (boa):
var someClass = function() {};
function f() {
var some = new someClass();
return function() {};
}
window.f_ = f();
Mas não será coletado lixo neste caso (ruim):
var someClass = function() {};
function f() {
var some = new someClass();
function unreachable() { some; }
return function() {};
}
window.f_ = f();
E a captura de tela correspondente:
Parece que um fechamento (neste caso function() {}
) mantém todos os objetos "vivos" se o objeto for referenciado por qualquer outro fechamento no mesmo contexto, independentemente de esse fechamento ser ou não alcançável.
Minha pergunta é sobre a coleta de lixo de fechamento em outros navegadores (IE 9+ e Firefox). Estou familiarizado com as ferramentas do webkit, como o criador de perfil de heap JavaScript, mas conheço pouco das ferramentas de outros navegadores, portanto não pude testar isso.
Em qual desses três casos o IE9 + e o Firefox coletam a someClass
instância?
unreachable
função nunca é executada, portanto nada é realmente registrado.