2010-10-13 3 views
3

Je fais beaucoup d'appels ajax sur mon site et utilisais jQuery 1.4.2 jusqu'à ce que je remarque qu'il fuyait. Il fuyait avec IE, Firefox et Chrome. Après une enquête, j'ai trouvé le correctif IE pour cela. Je l'ai essayé mais il ne l'a pas résolu pour l'un des trois navigateurs. J'ai ensuite trouvé un post sur ici où la personne a comparé la bibliothèque Javascript de Yahoo à jQuery. Yahoo n'a pas de fuite pour cette personne. Je suis passé à Yahoo et cela a arrêté la fuite dans IE et Firefox (j'ai même utilisé l'addon de Firefox). Mais Chrome fuit toujours. Chrome génère environ 200 Mo de mémoire, puis plante mon onglet. L'appel ajax est à chaque seconde. Il faut environ une heure avant que l'onglet se bloque. Si je quitte la page, la mémoire est libérée. Encore une fois, IE et Firefox le problème est maintenant disparu.Trouver la fuite de Javascript dans Chrome

Quelle est la meilleure façon de déterminer où le problème est pour Chrome? J'ai cherché un add-on mais n'en ai pas encore trouvé. J'ai aussi fait des recherches sur Google mais je n'y ai pas vraiment trouvé quelque chose. J'ai pris des snapshots de tas mais je vois juste de gros nombres à côté de (closure) et (code).

J'ai aimé le Firefox One (Leak Monitor), il est facile de voir le problème. Quelque chose comme ça pour Chrome ou des suggestions pour trouver la fuite?

+0

vous êtes sûr que c'est le navigateur? Avez-vous regardé votre code? Je fais aussi beaucoup de gros posts ajax et je n'ai jamais eu de fuite avec un navigateur. –

+0

J'ai regardé le code pendant deux jours. Je l'ai testé avec IE 8, Firefox 3.6.10 et Chrome 8.0.555.2. Comme je l'ai dit, il se passait avec tous les 3 jusqu'à ce que je l'ai changé pour utiliser les bibliothèques javascript de Yahoo. Maintenant, le problème ne se produit qu'avec Chrome. As-tu lu ce que j'ai écrit? – GregInWI2

Répondre

4

Le cadre ne cause pas la fuite, c'est votre code. Laissez-moi deviner à quoi ressemble votre code.

$.get('//url/',function(){ 
    //lets do fun stuff! 
    function(){ 
    //more fun expensive stuff for the browser to do 
    } 
}; 

//A more efficient way (doesn't create closures) 
function expensivefn(){ 
    //Do expensive stuff here 
} 
$.get('//url',expensivefn); 

Ceci est seulement une façon possible que votre code pourrait être inefficace. Je ne crée généralement pas de pages qui bouclent à l'infini, habituellement je cherche un certain laps de temps puis demande à l'utilisateur s'il veut toujours interroger. La boucle que vous utilisez pourrait créer des fermetures inutiles, tout comme l'exemple ci-dessus. Par exemple,

//Bad! 
setInterval(function(){ 
    //Expensive stuff 
}, 1000) 

//Good 
function expensivestuff(){ 
    //Expensive stuff 
} 
setInterval(expensivestuff,1000); 
+0

Je n'utilise plus jQuery J'utilise la bibliothèque de Yahoo. Mais oui, le premier exemple que vous devriez faire est similaire à ce que je faisais (à l'exclusion de la fonction à l'intérieur de la fonction). Je l'ai trouvé un tutoriel jQuery pour faire des appels ajax. Je demandais à propos d'un outil pour trouver la fuite comme ce qui est disponible pour Firefox. IE et Firefox sont maintenant heureux, mais Chrome ne l'est toujours pas. – GregInWI2

+0

En fait, en regardant le vieux code jQuery, je ne faisais pas ça. Ce à quoi il ressemble: $ ('# ajax'). Load (url); C'était fuyant. – GregInWI2

+0

Pouvez-vous poster votre correction à IE? Comment avez-vous déterminé que cette ligne fuyait ou en général que votre code JS fuyait, quels outils avez-vous utilisé – Drew

6

Utilisez Profiler Chrome Heap intégré dans DevTools (appuyez sur F12 dans Chrome puis passez à l'onglet Profils):

enter image description here

vous pouvez trouver ici comment tester:

link

+0

Je n'ai pas pu exécuter ce didacticiel avec succès. Comment puis-je trouver la référence "détachée"? – pauloya

+0

Je pense que c'est juste une faute de frappe dans le tutoriel. Essayez d'ajouter var detached = null; en tant que variable globale. – denu

+0

Je ne pense pas que cela changerait quoi que ce soit, puisque détaché est implicitement déclaré comme une variable globale. Ce profil de mémoire de tas semble difficile à comprendre et ce tutoriel n'aide pas du tout, je suppose que 'detaché' est montré comme un' HtmlDivElement' dans la liste, mais lequel est quoi? – pauloya

Questions connexes