6

我通过 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 毫秒,但这并没有帮助。
4

3 回答 3

1

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

var abc=null;
function gotData(data) {
latestTimestamp = data['timestamp'];
data=null;
clearTimeout(abc);
abc=setTimeout(fetchData, 250);
}
于 2012-04-30T11:50:38.237 回答
0

我相信这个问题出在 jQuery 和/或浏览器上。我经常在 AJAX 调用中看到类似的泄漏。

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

https://github.com/SignalR/SignalR

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

于 2012-04-12T16:39:05.557 回答
0

一旦你完成了 data[],你就可以摆脱它:

function gotData(data) {
    latestTimestamp = data['timestamp'];
    delete data;
    setTimeout(fetchData, 250);
} 
于 2012-04-12T15:47:35.387 回答