J'ai créé une page Web qui effectue un appel Ajax toutes les secondes. Dans Internet Explorer 7, elle perd beaucoup de mémoire (20 Mo en 15 minutes environ).
Le programme est très simple. Il exécute simplement une fonction JavaScript qui effectue un appel Ajax. Le serveur renvoie une chaîne vide, et le code JavaScript n'en fait rien. J'utilise setTimeout
pour exécuter la fonction toutes les secondes, et j'utilise Goutte à goutte pour regarder le truc.
Voici la source :
<html>
<head>
<script type="text/javascript" src="http://www.google.com/jsapi"></script>
<script type="text/javascript">
google.load('jquery', '1.4.2');
google.load('jqueryui', '1.7.2');
</script>
<script type="text/javascript">
setTimeout('testJunk()',1000);
function testJunk() {
$.ajax({ url: 'http://xxxxxxxxxxxxxx/test', // The url returns an empty string
dataType: 'html',
success: function(data){}
});
setTimeout('testJunk()',1000)
}
</script>
</head>
<body>
Why is memory usage going up?
</body>
</html>
Comment colmater cette fuite ? J'ai une application réelle qui met à jour une grande table de cette façon, mais si elle n'est pas surveillée, elle consomme des gigaoctets de mémoire.
Editar : ok, donc après quelques bonnes suggestions, j'ai modifié le code pour :
<html>
<head>
<script type="text/javascript" src="http://www.google.com/jsapi"></script>
<script type="text/javascript">
google.load('jquery', '1.4.2');
google.load('jqueryui', '1.7.2');
</script>
<script type="text/javascript">
setTimeout(testJunk,1000);
function testJunk() {
$.ajax({ url: 'http://xxxxxxxxxxxxxx/test', // The url returns an empty string
dataType: 'html',
success: function(data){setTimeout(testJunk,1000)}
});
}
</script>
</head>
<body>
Why is memory usage going up?
</body>
</html>
Cela n'a pas semblé faire de différence, cependant. Je ne fais rien avec le DOM, et si je commente l'appel Ajax, la fuite de mémoire s'arrête. Il semble donc que la fuite se situe entièrement dans l'appel Ajax. Est-ce que jQuery Ajax crée intrinsèquement une sorte de référence circulaire, et si oui, comment puis-je la libérer ? Au fait, il n'y a pas de fuite dans Firefox.
Quelqu'un a suggéré d'exécuter le test dans une autre VM et de voir si les résultats sont les mêmes. Plutôt que de mettre en place une autre VM, j'ai trouvé un ordinateur portable qui fonctionnait sous XP Home avec Internet Explorer 8. Il présente le même problème.
J'ai essayé des versions plus anciennes de jQuery et j'ai obtenu de meilleurs résultats, mais le problème n'a pas disparu entièrement jusqu'à ce que j'abandonne Ajax dans jQuery et que j'opte pour un Ajax plus traditionnel (et plus laid).