Я зареєстрував таку помилку 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
функція ніколи не виконується, тому насправді нічого не реєструється.