在我的 javascript 应用程序中,当进行 AJAX
调用以检索 JSON
对象时,我有很大的内存泄漏。代码非常简单:
function getNewMessage()
{
new_message = []; // this is global variable
var input_for_ball = [];
var sum;
var i;
var http = new XMLHttpRequest();
http.open("GET", url + "/random_ball.json", false);
http.onreadystatechange = function()
{
if(http.readyState === 4 && http.status === 200)
{
var responseTxt = http.responseText;
input_for_ball = JSON.parse('[' + responseTxt + ']');
}
}
http.send(null);
new_message = input_for_ball;
}
这每 1 毫秒调用一次,如您所见,它是同步调用。此功能每 1 秒耗费我 1MB。
当我使用而不是 AJAX
只是分配给变量时:
input_for_ball = JSON.parse('[0,0,0,0,0,0,0,0,0,0]');
那么它的一切都很完美。所以错误一定是在我对 AJAX
调用的实现中。当我也使用 jQuery AJAX
调用时会发生这种情况。
2013 年 12 月 3 日更新
正如下面提到的Tom van der Woerdt
,这确实是有意为之的行为。因此,正如 Matt B.
所建议的那样,我重写了一些代码以使异步调用成为可能,这很有帮助。现在我的应用程序内存消耗稳定且小。
最佳答案
我认为不是 AJAX 调用,而是闭包会占用您的内存。您的 onreadystatechange 函数引用了 http 对象(因此对此的引用将与匿名函数一起保留)。
我认为您的代码与此链接中示例 1 中的模式匹配 http://www.ibm.com/developerworks/web/library/wa-memleak/
如果您以前没有在 javascript 中遇到过闭包,那么它们非常值得一读 - 理解它们可以解释很多乍一看似乎没有意义的行为。
关于javascript - 使用 AJAX JSON 调用时内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15337374/