2012-04-12 11 views
5

Ich erhalte wiederholt ein JSON-Objekt vom Server mit AJAX-Aufrufen. Mit der Zeit wächst der Speicherverbrauch des Browsers (versucht mit Chrome, Safari, Firefox). Mit den Half-Snapshots von Chrome habe ich festgestellt, dass die Timestamp-Zeichenfolgen ohne Referenzen bleiben. Wenn ich eine Sequenz von Snapshots mache, sehe ich, dass die Anzahl der Strings ständig zunimmt.Speicherverlust mit AJAX-Anfragen + jQuery

$(function() { 
    var latestTimestamp = 0; 

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

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

    fetchData(); 
}); 

Andere Anmerkungen:

  • ich jQuery 1.7.1 mit bin. EDIT: Habe gerade mit 1.6.2 und 1.4.2 versucht, gleiches Problem.
  • Die timestamp im JSON-Objekt ist eigentlich eine ganze Zahl, keine Zeichenfolge. Die akkumulierenden Strings könnten also temporäre Werte sein?
  • Das Entfernen der + latestTimestamp aus der AJAX-Anforderung stoppt das Leck.
  • Ein schneller setTimeout (20ms) verursacht das Leck schneller. Ich dachte, die schnelle Auszeit könnte daran schuld sein, also habe ich es auf 250ms reduziert, aber das hat nicht geholfen.
+1

@Vega FetchData ist schon da im Code;) (Linie 4) – Dave

+0

Vielleicht werden es vorziehen, JQuery $ .get ("/ Parameter", {Format: "json", da: latestTimestamp}, gotData); – nikoshr

+0

@nikoshr Coole Idee. Ich habe es gerade versucht, aber es leckt immer noch. – Dave

Antwort

0

Sobald Sie mit den Daten fertig sind [], können Sie es loswerden:

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

Ich habe es einfach versucht, aber die Heap-Snapshots von Chrome zeigen immer noch eine ständig wachsende Anzahl von Strings zwischen Snapshots. – Dave

0

Ich glaube, das Problem liegt bei jQuery und/oder Browsern. Ich habe ähnliche Lecks mit oft AJAX-Anrufen gesehen.

Anstatt den Server vier Mal pro Sekunde abzufragen, sollten Sie Daten vom Server zum Client übertragen. Ich weiß nicht, auf welcher Plattform Sie verwenden, aber wenn es .Net Sie vielleicht einen Blick auf SignalR

https://github.com/SignalR/SignalR

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

+0

Nun, ich benutze .Net nicht, und der Server, mit dem ich arbeite, ist benutzerdefiniert und in C++ geschrieben, aber vielleicht ist ein echter Server-zu-Client-Push etwas, das ich untersuchen sollte. – Dave

0

Haben Sie clear Javascript-Funktion versuchen zu nehmen? Wenn nicht, bitte versuchen Sie es.

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