Ho registrato il seguente bug di Chrome , che ha portato a molte perdite di memoria gravi e non ovvie nel mio codice:
(Questi risultati utilizzano il profiler di memoria di Chrome Dev Tools , che esegue il GC, e quindi acquisisce un'istantanea di heap di tutto ciò che non è stato raccolto e raccolto.)
Nel codice seguente, l' someClass
istanza è garbage collection (buona):
var someClass = function() {};
function f() {
var some = new someClass();
return function() {};
}
window.f_ = f();
Ma non sarà spazzatura raccolta in questo caso (male):
var someClass = function() {};
function f() {
var some = new someClass();
function unreachable() { some; }
return function() {};
}
window.f_ = f();
E lo screenshot corrispondente:
Sembra che una chiusura (in questo caso function() {}
) mantenga "vivi" tutti gli oggetti se l'oggetto è referenziato da qualsiasi altra chiusura nello stesso contesto, indipendentemente dal fatto che tale chiusura stessa sia o meno raggiungibile.
La mia domanda riguarda la garbage collection della chiusura in altri browser (IE 9+ e Firefox). Conosco abbastanza bene gli strumenti di webkit, come il profiler di heap JavaScript, ma conosco poco degli strumenti di altri browser, quindi non sono stato in grado di testarlo.
In quale di questi tre casi IE9 + e Firefox garbage raccolgono l' someClass
istanza?
unreachable
funzione non viene mai eseguita, quindi non viene registrato nulla.