2010-06-07 6 views
6

J'ai un javascript (utilisé avec google maps api) que je suis en train de tester sur IE et Chrome et j'ai remarqué des symptômes de fuites de mémoire dans IE seulement: quand je rafraîchis la page, la quantité de mémoire utilisée en croissance (rapide), mais dans Chrome, il reste constant. Sans poster tout le code (car c'est plutôt long), puis-je avoir des suggestions sur ce qu'il faut faire attention? Qu'est-ce qui pourrait causer la croissance continue de la mémoire dans IE dans les actualisations de la page? Comme je l'ai dit, je sais que c'est dur sans code, mais j'aimerais voir si un conseil générique fonctionne en premier. Merci.javascript fuite de mémoire

Mise à jour: merci pour les réponses jusqu'à présent. Comme une vérification de santé mentale, j'ai couru le goi google maps "Hello World" code from google pour voir ce qui se passerait dans IE (le code est montré ci-dessous). Lorsque vous exécutez ce code dans IE, lorsque je continue à actualiser la page encore et encore, la mémoire ne cesse de croître et de croître. Est-ce une fuite de mémoire? Cela ne marche pas comme la fonctionnalité semble destiné ...

<html> 
<head> 
<meta name="viewport" content="initial-scale=1.0, user-scalable=no" /> 
<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script> 
<script type="text/javascript"> 
    function initialize() { 
    var latlng = new google.maps.LatLng(-34.397, 150.644); 
    var myOptions = { 
     zoom: 8, 
     center: latlng, 
     mapTypeId: google.maps.MapTypeId.ROADMAP 
    }; 
    var map = new google.maps.Map(document.getElementById("map_canvas"), myOptions); 
    } 

</script> 
</head> 
<body onload="initialize()"> 
    <div id="map_canvas" style="width:100%; height:100%"></div> 
</body> 
</html> 

Mise à jour 2: Ainsi est-il pas moyen d'obtenir ce google Bonjour Mappemonde Code api pour fonctionner sans fuite de mémoire dans IE? J'ai remarqué que si je cours la même expérience sur maps.google.com il ne semble pas y avoir de fuite ... Ce serait génial si quelqu'un pouvait m'aider à modifier le code de bonjour pour qu'il ne fuie pas dans IE; De cette façon, je peux en tirer parti (cela ne me dérange pas d'utiliser JQuery si cela peut vous aider, mais je l'ai essayé sur le code Hello World et ça fuyait toujours dans IE). Merci encore

+1

IE 6 avait un problème de fuite très spécifique où, si vous ne l'avez pas Null tous les gestionnaires d'événements (onclick, onmousever, onload) sur Éléments HTML que vous avez créés ng et détruisant dynamiquement, ces références ne seraient jamais récupérées. Cela a été corrigé dans les versions ultérieures. Donc, si vous rencontrez cela dans IE6, c'est probablement votre problème (bien que le code de Google devrait être au-dessus de ce problème). Rappelez-vous que le navigateur exécutera son garbage collector lorsqu'il en a envie, et presque jamais quand vous l'attendez. L'utilisation de la mémoire diminue-t-elle si vous attendez? – Andrew

+0

J'utilise en fait IE 7, et la mémoire ne tombe pas en attente ... comment est-ce que je "annulerais tous les gestionnaires d'événements" quand je l'attacherais simplement à ? – hhj

+1

Si vous utilisez IE 7, ce problème ne devrait pas vous affecter. Le problème était que si vous aviez des éléments liés à des événements (si la carte avait une fonctionnalité de glisser-déposer, alors cela est le cas), vous deviez parcourir tous les éléments ayant des gestionnaires d'événements et dire ' document.getElementById ('mydiv'). onclick = null; 'etc. Mais vous avez complètement raison. Dans le cas de votre code ci-dessus, il n'y a rien de mal que vous faites que je puisse voir. Ce doit être un problème avec le code Google - la pire réponse que je puisse donner. – Andrew

Répondre

7

Mise à jour:

J'ai testé le code ci-dessus avec drip.exe et il semble qu'il y ait vraiment quelque chose comme une fuite de mémoire. L'utilisation de la mémoire a augmenté régulièrement pendant l'exécution du code avec un rafraîchissement automatique pendant quelques minutes.

Mise à jour 2:

Je pense que c'est le bug: http://code.google.com/p/gmaps-api-issues/issues/detail?id=1555&can=1&q=unload&colspec=ID%20Type%20Status%20Introduced%20Fixed%20Summary%20Internal%20Stars

+0

Qu'est-ce qui vous amène à croire que le problème lié à l'API gmaps est le problème? il ne semble pas avoir beaucoup à faire avec les fuites de mémoire IE. Nous rencontrons le même problème dans IE7, il semble être un showstopper pour ce navigateur ... – matao

+0

@matao les tests avec goutte à goutte sont très \t significatif – powtac

+0

@matao, comme je l'ai dit dans ma section mise à jour, goutte à goutte montre que le mem la consommation a augmenté tout en rafraîchissant et puisqu'il n'y a pas d'autre code que les cartes g, la fuite doit être quelque part là. Je suis sûr qu'en attendant ce problème a été résolu par g, ou la suggestion d'Andrew selon les docs devrait être utilisée: 'onunload =" GUnload() "' – powtac

1

Une source bien connue de fuites de mémoire IE est la (délibérée ou accidentelle) piégeage de Javascript "trucs" dans les fermetures (fonctions) liées en tant que gestionnaires d'événements aux éléments DOM. La plupart des frameworks s'efforcent de supprimer les gestionnaires d'événements explicitement pour cette raison.

1

Vous devez également exécuter GUnload avant de quitter la page.Ajoutez simplement un « unload » l'événement:

<body onload="initialize()" onunload="GUnload()"> 

En savoir plus sur cette fuite au Google Maps API

+2

J'utilise api v3. Merci pour la suggestion cependant. – hhj