2012-04-12 26 views
5

Estoy buscando repetidamente un objeto JSON del servidor con llamadas AJAX. Con el tiempo, el uso de memoria del navegador crece (probado con Chrome, Safari, Firefox). Utilizando las instantáneas de Heap de Chrome, he descubierto que las cadenas de marcas de tiempo se dejan sin referencias. Si tomo una secuencia de instantáneas, veo que el número de Cadenas aumenta continuamente.Fuga de memoria con solicitudes AJAX + jQuery

$(function() { 
    var latestTimestamp = 0; 

    function fetchData() { 
     $.get("/parameter?format=json&since=" + latestTimestamp, gotData) 
    } 

    function gotData(data) { 
     latestTimestamp = data['timestamp']; 
     setTimeout(fetchData, 250); 
    } 

    fetchData(); 
}); 

Otras notas:

  • que estoy usando jQuery 1.7.1. EDITAR: Acabo de probar con 1.6.2 y 1.4.2, el mismo problema.
  • El timestamp en el objeto JSON es en realidad un número entero, no una cadena. ¿Entonces las cadenas acumuladas pueden ser valores temporales?
  • Al eliminar + latestTimestamp de la solicitud AJAX se detiene la fuga.
  • Un setTimeout (20ms) más rápido hace que la fuga sea más rápida. Pensé que el tiempo de espera rápido podría ser el culpable, así que lo reduje a 250ms, pero eso no ayudó.
+1

@Vega fetchData ya está ahí en el código;) (línea 4) – Dave

+0

Tal jQuery preferirán $ .get ("/ parámetro", {formato: "json", ya que: latestTimestamp}, gotData); – nikoshr

+0

@nikoshr Buena idea. Lo intenté, pero sigue goteando. – Dave

Respuesta

0

Una vez que haya terminado con los datos [], puede deshacerse de él:

function gotData(data) { 
    latestTimestamp = data['timestamp']; 
    delete data; 
    setTimeout(fetchData, 250); 
} 
+0

Acabo de probar esto, pero las instantáneas de montón de Chrome todavía muestran un número cada vez mayor de cadenas entre las instantáneas. – Dave

0

Creo que este problema se encuentra con jQuery y/o navegadores. He visto una fuga similar con llamadas AJAX a menudo.

En lugar de sondear el servidor 4 veces por segundo considere la posibilidad de enviar datos del servidor al cliente. No sé qué plataforma que está utilizando, pero si es .Net puede que desee echar un vistazo a SignalR

https://github.com/SignalR/SignalR

http://www.hanselman.com/blog/AsynchronousScalableWebApplicationsWithRealtimePersistentLongrunningConnectionsWithSignalR.aspx

+0

Bueno, no estoy usando .Net, y el servidor con el que estoy trabajando es personalizado y está escrito en C++, pero tal vez sea una cuestión real que deba estudiarse la inserción real de servidor a cliente. – Dave

0

¿Usted intentó clearTimeout función javascript? si no, por favor intente esto.

var abc=null; 
function gotData(data) { 
latestTimestamp = data['timestamp']; 
data=null; 
clearTimeout(abc); 
abc=setTimeout(fetchData, 250); 
}