2012-04-12 11 views
5

Powtarzam pobieranie obiektu JSON z serwera przy użyciu wywołań AJAX. Z czasem rośnie wykorzystanie pamięci przeglądarki (wypróbowane w Chrome, Safari, Firefox). Korzystając z migawek sterty Chrome odkryłem, że ciągi znacznika czasu są pozostawione bez odnośników. Jeśli wykonam sekwencję migawek, widzę, że liczba Ciągów stale rośnie.Przeciek pamięci z żądaniami 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(); 
}); 

Inne uwagi:

  • używam jQuery 1.7.1. EDYCJA: Próbowałem po prostu z 1.6.2 i 1.4.2, ten sam problem.
  • Obiekt timestamp w obiekcie JSON jest w rzeczywistości liczbą całkowitą, a nie ciągiem. Czy więc akumulujące się struny mogą być wartościami tymczasowymi?
  • Usunięcie + latestTimestamp z żądania AJAX zatrzymuje wyciek.
  • Szybszy setTimeout (20 ms) powoduje szybszy wyciek. Myślałem, że może to być szybki czas oczekiwania, więc zmniejszyłem go do 250 ms, ale to nie pomogło.
+1

@Vega fetchData już istnieje w kodzie;) (linia 4) – Dave

+0

Może JQuery wolą $ .get ("/", {parametr format: "json", ponieważ: latestTimestamp}, gotData); – nikoshr

+0

@nikoshr Fajny pomysł. Po prostu próbowałem, ale wciąż przecieka. – Dave

Odpowiedz

0

Kiedy skończysz z danych [], można się go pozbyć:

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

Po prostu to wypróbowałem, ale migawki stosu Chrome wciąż pokazują stale rosnącą liczbę ciągów między migawkami. – Dave

0

wierzę, to problem leży z jQuery i/lub przeglądarek. Widziałem podobny wyciek z często połączeń AJAX.

Zamiast przepytywać serwer 4 razy na sekundę, rozważ przesłanie danych z serwera do klienta. Nie wiem, co platforma używasz, ale jeśli jest to .Net warto przyjrzeć SignalR

https://github.com/SignalR/SignalR

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

+0

Cóż, nie używam .Net, a serwer z którym pracuję jest niestandardowy i napisany w C++, ale być może prawdziwy push od serwera do klienta jest czymś, na co powinienem zaglądać. – Dave

0

Próbowałaś clearTimeout funkcji JavaScript? jeśli nie, spróbuj tego.

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