Necesito actualizar una gran cantidad de datos dentro de un intervalo determinado con JavaScript. El problema es que, sin importar qué biblioteca JS use (incluso bare-bone js), todos los navegadores parecen asignar memoria en cada solicitud de AJAX y no pueden liberarla después. Aquí está una muestra cortada con tijeras que deben reproducir el error:Los navegadores siguen comiendo memoria con AJAX + setInterval
<!DOCTYPE html>
<html lang="en">
<head>
<title>Memleak Test</title>
<meta charset="utf-8" />
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.min.js"></script>
<script type="text/javascript">
function readData() {
$.getJSON('data.php');
}
$(document).ready(function() {
setInterval(readData, 1000);
});
</script>
</head>
<body>
<div id="content"></div>
</body>
</html>
Una página de prueba equivalente está disponible en jsbin
Aquí hay más información sobre esto:
- También traté de poner el ReadData() funciona como un cierre directamente en la llamada setInterval(). Esto no parece hacer ninguna diferencia.
- Uso jQuery aquí, pero cualquier otra biblioteca produciría los mismos errores.
- Mi script data.php solo produce un falso objeto JSON con json_encode() en PHP.
- Sé que un segundo es un período de tiempo corto aquí, en mi secuencia de comandos de producción el plazo es de 30 segundos. Solo quería ver el efecto más rápido (en la aplicación de producción lleva horas pero luego la memoria también está llena).
- El problema aquí es que la aplicación estará abierta 24/7.
Parece tan simple que creo que estoy haciendo algo realmente malo aquí, sería genial si algunos de los gurús de JS aquí me pueden ayudar.
En su * real * de la prueba se le manipulando el DOM, a través de '.html' o de otra manera? – karim79
karim79, en mi entorno de producción, por supuesto, manipulo el DOM. Cuando traté de rastrear el problema, pude reducirlo a la llamada ajax y para mi sorpresa esta "fuga" también ocurre sin manipulación DOM. Supongo que el navegador no puede liberar la memoria asignada dentro de la llamada setIntervall, pero no sé cómo evitarlo. – daschl
¿Qué pasaría si lo cambiara para que cada N lo solicite, refresca la página del navegador en lugar de hacer la llamada AJAX? – notJim