Я зарегистрировал следующую ошибку Chrome, которая привела ко многим серьезным и неочевидным утечкам памяти в моем коде:
(В этих результатах используется утилита Chrome Dev Tools профайлер памяти, в которой запускается GC, а затем получает снимок кучи всего, что не собрано в мусор. )
В приведенном ниже примере экземпляр someClass
- сбор мусора (хороший):
var someClass = function() {};
function f() {
var some = new someClass();
return function() {};
}
window.f_ = f();
Но в этом случае это не будет сбор мусора (плохо):
var someClass = function() {};
function f() {
var some = new someClass();
function unreachable() { some; }
return function() {};
}
window.f_ = f();
И соответствующий снимок экрана:
Кажется, что замыкание (в данном случае function() {}
) сохраняет все объекты "живыми", если объект ссылается на любое другое закрытие в том же контексте, независимо от того, является ли это закрытие даже достижимым.
Мой вопрос касается сбора мусора закрытия в других браузерах (IE 9+ и Firefox). Я хорошо знаком с инструментами webkit, такими как javascript-обработчик JavaScript, но я мало знаю о других инструментах браузеров, поэтому я не смог проверить это.
В каком из этих трех случаев мусор IE9 + и Firefox собирает экземпляр someClass
?