内存泄漏与AJAX请求+ jQuery

时间:2012-04-12 15:32:15

标签: jquery ajax json memory-leaks

我反复使用AJAX调用从服务器获取JSON对象。随着时间的推移,浏览器的内存使用量会增长(尝试使用Chrome,Safari,Firefox)。使用Chrome的堆快照,我发现时间戳字符串没有引用。如果我拍摄一系列快照,我会看到字符串的数量不断增加。

$(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)会导致泄漏更快。我认为快速超时可能是责任,所以我把它减少到250毫秒,但这没有帮助。

3 个答案:

答案 0 :(得分:0)

完成数据[]后,您可以摆脱它:

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

答案 1 :(得分:0)

我认为这个问题在于jQuery和/或浏览器。我经常看到类似的泄漏,通常是AJAX调用。

不要每秒轮询服务器4次,而是考虑将数据从服务器推送到客户端。我不知道你正在使用什么平台,但如果它是.Net你可能想看看SignalR

https://github.com/SignalR/SignalR

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

答案 2 :(得分:0)

您是否尝试过cleartimeout javascript功能?如果没有,请试试这个。

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