2010-09-02 5 views
2

je me demandais si le code suivant causerait des problèmes comme la fuite de mémoirecollecte des ordures de jquery.html

<html> 
<head> 
    <script type='text/javascript' src='jquery-1.4.2.js'> </script> 
    <script type="text/javascript"> 
     function a(){ 
      for(var i = 0; i < 50000; i++){ 
       $("#d").html("<span>" + i + "</span>"); 
      } 
     } 

    </script> 
</head> 
<body onload='a();'> 
    <div id="d"></div> 
</body> 

Répondre

3

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

alt text

Après la page d'ouverture (23000 objets HTMLelement avaient déjà été libérés immédiatement, autour de 27000 ont été restant)

alt text

Moins d'une seconde plus tard (tous les 27000 objets sauf 1 ont été libérés)

alt text

+0

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. –

+0

@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

+0

(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. –

1

Il sera utilisation mémoire (peut-être de l'ordre d'un méga-octet ou 2) mais il ne le fuira pas.

Lorsque la page est fermée, la mémoire doit être restaurée.

Mes résultats sur une sale instance de Firefox:

     Memory used (allow several seconds to settle) 
         ----------------------------------------------- 
Before opening page:  163,332K 
Open and page finished:  164,932K (temporarily spiked to about 210M) 
After page closed:   163,668K 

Notez que la légère différence pourrait être l'un des nombreux autres onglets ouverts, ou il pourrait y avoir des fuites de mémoire que Firefox est célèbre pour, mais il est probablement pas ce code JS.

Questions connexes