Ich habe den folgenden Chrome-Fehler protokolliert , der zu vielen schwerwiegenden und nicht offensichtlichen Speicherverlusten in meinem Code geführt hat:
(Diese Ergebnisse verwenden den Speicherprofiler von Chrome Dev Tools , mit dem der GC ausgeführt wird, und erstellen dann einen Heap-Snapshot von allem, was nicht gesammelt wurde.)
Im folgenden Code ist die someClass
Instanz Müll gesammelt (gut):
var someClass = function() {};
function f() {
var some = new someClass();
return function() {};
}
window.f_ = f();
In diesem Fall wird jedoch kein Müll gesammelt (schlecht):
var someClass = function() {};
function f() {
var some = new someClass();
function unreachable() { some; }
return function() {};
}
window.f_ = f();
Und der entsprechende Screenshot:
Es scheint, dass ein Abschluss (in diesem Fall function() {}
) alle Objekte "am Leben" hält, wenn das Objekt von einem anderen Abschluss im selben Kontext referenziert wird, unabhängig davon, ob dieser Abschluss selbst erreichbar ist oder nicht.
Meine Frage betrifft die Speicherbereinigung der Schließung in anderen Browsern (IE 9+ und Firefox). Ich bin mit den Tools des Webkits wie dem JavaScript-Heap-Profiler ziemlich vertraut, kenne aber nur wenige Tools anderer Browser, sodass ich dies nicht testen konnte.
In welchem dieser drei Fälle sammeln IE9 + und Firefox-Garbage die someClass
Instanz?
unreachable
Funktion nie ausgeführt, sodass tatsächlich nichts protokolliert wird.