Zarejestrowałem następujący błąd przeglądarki Chrome , który doprowadził do wielu poważnych i nieoczywistych wycieków pamięci w moim kodzie:
(Te wyniki wykorzystują profiler pamięci Chrome Dev Tools , który uruchamia GC, a następnie tworzy migawkę sterty wszystkiego, co nie zostało zebrane).
W poniższym kodzie someClass
instancja jest odśmiecana (dobra):
var someClass = function() {};
function f() {
var some = new someClass();
return function() {};
}
window.f_ = f();
Ale w tym przypadku nie będzie to śmieci (źle):
var someClass = function() {};
function f() {
var some = new someClass();
function unreachable() { some; }
return function() {};
}
window.f_ = f();
I odpowiedni zrzut ekranu:
Wydaje się, że zamknięcie (w tym przypadku function() {}
) utrzymuje wszystkie obiekty „przy życiu”, jeśli do obiektu odwołuje się jakiekolwiek inne zamknięcie w tym samym kontekście, niezależnie od tego, czy samo zamknięcie jest osiągalne, czy nie.
Moje pytanie dotyczy usuwania śmieci z zamykania w innych przeglądarkach (IE 9+ i Firefox). Jestem dość zaznajomiony z narzędziami webkit, takimi jak profiler stosu JavaScript, ale niewiele wiem o narzędziach innych przeglądarek, więc nie byłem w stanie tego przetestować.
W którym z tych trzech przypadków IE9 + i Firefox będą zbierać śmieci z someClass
instancji?
unreachable
funkcja nigdy nie jest wykonywana, więc w rzeczywistości nic nie jest rejestrowane.