Я зарегистрировал следующую ошибку 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-профилировщик кучи, но я мало знаком с инструментами других браузеров, поэтому я не смог проверить это.
В каком из этих трех случаев IE9 + и мусор Firefox будут собирать someClass
экземпляр?
unreachable
функция никогда не выполняется, поэтому на самом деле ничего не регистрируется.