Creé una página web que hace una llamada Ajax cada segundo. En Internet Explorer 7, pierde memoria mal (20 MB en unos 15 minutos).Llamada jQuery Ajax simple pierde memoria en Internet Explorer
El programa es muy simple. Simplemente ejecuta una función de JavaScript que realiza una llamada Ajax. El servidor devuelve una cadena vacía y el código JavaScript no hace nada con ella. Yo uso setTimeout
para ejecutar la función cada segundo, y estoy usando Drip para ver la cosa.
Aquí está la fuente:
<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>
Cómo conectar esta filtración? Tengo una aplicación real que actualiza una gran mesa de esta manera, pero sin supervisión, consumirá gigabytes de memoria.
Editar: bien, así que después de algunas buenas sugerencias, he modificado el código para:
<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>
No parecía hacer ninguna diferencia, sin embargo. No estoy haciendo nada con el DOM, y si hago un comentario sobre la llamada Ajax, la pérdida de memoria se detiene. Entonces parece que la fuga está completamente en la llamada de Ajax. ¿Inherentemente jQuery Ajax crea algún tipo de referencia circular, y si es así, cómo puedo liberarlo? Por cierto, no se filtra en Firefox.
Alguien sugirió ejecutar la prueba en otra VM y ver si los resultados son los mismos. En lugar de configurar otra máquina virtual, encontré una computadora portátil que ejecutaba XP Home con Internet Explorer 8. Presenta el mismo problema.
Probé algunas versiones anteriores de jQuery y obtuve mejores resultados, pero el problema no desapareció por completo hasta que abandoné Ajax en jQuery y fui con el Ajax más tradicional (y feo).
también muy curiosos acerca de la respuesta - Tengo ideas pero quiero saber los resultados. – Plynx
Buena pregunta, no sé la respuesta, pero podría considerar tener el setTimeout en la función de éxito para que no termine sobrecargando el servidor si comienza a hacer solicitudes que llevan tiempo. En caso de que no hayas recibido toda la respuesta del servidor antes de enviar la siguiente solicitud, abrirás una nueva conexión. – MyGGaN
Gracias por la sugerencia de mover setTimeout. Lo intenté, pero no ayudó. –