J'ai enregistré le bogue Chrome suivant , qui a conduit à de nombreuses fuites de mémoire graves et non évidentes dans mon code:
(Ces résultats utilisent le profileur de mémoire de Chrome Dev Tools , qui exécute le GC, puis prend un instantané du tas de tout ce qui n'a pas été collecté.)
Dans le code ci-dessous, l' someClass
instance est garbage collecté (bon):
var someClass = function() {};
function f() {
var some = new someClass();
return function() {};
}
window.f_ = f();
Mais ce ne sera pas ramassé dans ce cas (mauvais):
var someClass = function() {};
function f() {
var some = new someClass();
function unreachable() { some; }
return function() {};
}
window.f_ = f();
Et la capture d'écran correspondante:
Il semble qu'une fermeture (dans ce cas, function() {}
) garde tous les objets «vivants» si l'objet est référencé par une autre fermeture dans le même contexte, que cette fermeture soit même accessible ou non.
Ma question porte sur le ramassage des ordures de fermeture dans d'autres navigateurs (IE 9+ et Firefox). Je connais assez bien les outils de webkit, tels que le profileur de tas JavaScript, mais je connais peu les outils des autres navigateurs, donc je n'ai pas pu tester cela.
Dans lequel de ces trois cas IE9 + et Firefox collecteront-ils l' someClass
instance?
unreachable
fonction n'est jamais exécutée, donc rien n'est réellement enregistré.