4

在我的 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.建议的那样,我重写了一些代码以使异步调用成为可能,并且帮助很大。现在我的应用程序内存消耗稳定且小。

4

1 回答 1

3

我不认为这是 AJAX 调用,而是关闭会占用您的内存。您的 onreadystatechange 函数引用了 http 对象(因此对 this 的引用将与匿名函数一起保存)。

我认为您的代码与此链接中示例 1 中的模式相匹配http://www.ibm.com/developerworks/web/library/wa-memleak/

如果您之前没有遇到过 javascript 中的闭包,那么它们非常值得继续阅读 - 理解它们解释了很多乍一看似乎没有意义的行为。

于 2013-03-11T11:35:12.613 回答