Une plage simple est créée ici à chaque itération. La fonction html()
de jQuery exécute une fonction interne cleanData
qui supprime les données et les événements associés de tous les nœuds contenus, ce qui n'est pas le cas ici.
Ensuite, jQuery définit la propriété innerHTML sur la chaîne transmise qui libère les éléments existants. C'est au garbage collector du navigateur de récupérer cette mémoire dès que possible. Il n'y a aucune fuite dans ce code. Chrome est en fait très rapide en libérant cette mémoire. Je vois une baisse de 2,421 Mo à 748 Ko principalement à partir des éléments de portée en moins de 3 secondes.
Il n'attend pas le déchargement de la page pour libérer cette mémoire. Ces trois instantanés ont été espacés de moins d'une seconde, au cours de laquelle près de 26000 objets ont été libérés de la mémoire.
Avant d'ouvrir la page
Après la page d'ouverture (23000 objets HTMLelement avaient déjà été libérés immédiatement, autour de 27000 ont été restant)
Moins d'une seconde plus tard (tous les 27000 objets sauf 1 ont été libérés)
Vous confondez la mémoire dynamique utilisée pendant l'exécution du script avec la mémoire globale utilisée par la page. Chrome ne libère pas toute la mémoire de la page tant que la page n'est pas fermée. En fait, Chrome ne s'est pas mieux comporté, en termes de mémoire, que Firefox. –
@Brock - Cela n'a aucun sens du tout. Je pense que vous faites référence à l'utilisation maximale qui, à un moment donné, avait 50000 objets alloués. Cependant, c'était très court. V8 a immédiatement commencé à libérer ces objets inutilisés. Oh, et le gc n'attend pas que la page soit déchargée pour récupérer cette mémoire. – Anurag
(1) Mesurez la mémoire utilisée. Maintenant (2) ouvrez un onglet pour le code. La mémoire augmentera et, après plusieurs secondes, diminuera jusqu'à atteindre une nouvelle valeur supérieure de plusieurs mégaoctets à l'étape 1. Cette nouvelle utilisation de la mémoire ne sera absolument pas récupérée ** tant que la page n'aura pas été déchargée. –