2012-04-12 76 views
5

我重複從AJAX調用服務器獲取JSON對象。隨着時間的推移,瀏覽器的內存使用量不斷增加(通過Chrome,Safari,Firefox進行嘗試)。使用Chrome瀏覽器的堆快照,我發現時間戳字符串沒有引用。如果我拍攝一系列快照,我會看到字符串的數量不斷增加。內存泄漏與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(); 
}); 

其他說明:

  • 我使用jQuery 1.7.1。編輯:剛剛嘗試1.6.2和1.4.2,同樣的問題。
  • JSON對象中的timestamp實際上是一個整數,而不是一個字符串。所以積累的字符串可能是臨時值?
  • 從AJAX請求中刪除+ latestTimestamp即可停止泄漏。
  • 更快的setTimeout(20ms)會導致泄漏更快。我認爲快速超時可能是責備,所以我把它縮短到250ms,但這沒有幫助。
+1

@Vega fetchData已經存在的代碼;)(第4行) – Dave 2012-04-12 16:32:43

+0

也許jQuery將傾向於$獲得( 「/參數」,{格式爲: 「JSON」,因爲:latestTimestamp},gotData); – nikoshr 2012-04-12 17:09:32

+0

@nikoshr很酷的想法。剛剛嘗試過,但仍然泄漏。 – Dave 2012-04-12 18:20:31

回答

0

一旦你的數據做[],你可以擺脫它:

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

我剛剛嘗試過,但Chrome的堆快照仍然顯示快照之間的字符串數量不斷增加。 – Dave 2012-04-12 16:31:47

0

我相信這個問題在於jQuery和/或瀏覽器。我經常看到類似的AJAX調用泄漏。

而不是每秒輪詢服務器4次考慮推送數據從服務器到客戶端。我不知道你使用的是什麼平臺,但如果它的.Net你可能想你嘗試cleartimeout JavaScript函數來看一看SignalR

https://github.com/SignalR/SignalR

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

+0

嗯,我沒有使用.Net,我正在使用的服務器是自定義的,並用C++編寫,但也許真正的服務器到客戶端的推送是我應該考慮的。 – Dave 2012-04-12 17:58:01

0

?如果不是,請嘗試這個。

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