AJAX 请求 + jQuery 的内存泄漏
Posted
技术标签:
【中文标题】AJAX 请求 + jQuery 的内存泄漏【英文标题】:Memory leak with AJAX requests + jQuery 【发布时间】:2012-04-24 23:49:13 【问题描述】:我通过 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 毫秒,但这并没有帮助。
【问题讨论】:
@Vega fetchData 已经存在于代码中;)(第 4 行) 也许 JQuery 会更喜欢 $.get("/parameter", format:"json",since:latestTimestamp, gotData); @nikoshr 好主意。刚试了一下,还是漏水。 【参考方案1】:一旦你完成了 data[],你就可以摆脱它:
function gotData(data)
latestTimestamp = data['timestamp'];
delete data;
setTimeout(fetchData, 250);
【讨论】:
我刚刚试了一下,但 Chrome 的堆快照仍然显示快照之间的字符串数量不断增加。【参考方案2】:我相信这个问题出在 jQuery 和/或浏览器上。我经常在 AJAX 调用中看到类似的泄漏。
考虑将数据从服务器推送到客户端,而不是每秒轮询服务器 4 次。我不知道您使用的是什么平台,但如果是 .Net,您可能想看看 SignalR
https://github.com/SignalR/SignalR
http://www.hanselman.com/blog/AsynchronousScalableWebApplicationsWithRealtimePersistentLongrunningConnectionsWithSignalR.aspx
【讨论】:
好吧,我没有使用 .Net,我使用的服务器是自定义的,用 C++ 编写,但也许真正的服务器到客户端推送是我应该研究的。 【参考方案3】:您是否尝试过 cleartimeout javascript 函数?如果没有,请试试这个。
var abc=null;
function gotData(data)
latestTimestamp = data['timestamp'];
data=null;
clearTimeout(abc);
abc=setTimeout(fetchData, 250);
【讨论】:
以上是关于AJAX 请求 + jQuery 的内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章