使用AJAX JSON调用时内存泄漏

Memory leaks when using AJAX JSON call

本文关键字:内存 泄漏 调用 AJAX JSON 使用      更新时间:2023-09-26

在我的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调用时也发生了这种情况。

更新12/03/2013

正如Tom van der Woerdt下面提到的,这确实是预期的行为。因此,正如Matt B.建议的那样,我重写了一些代码,使异步调用成为可能,这很有帮助。现在我的应用程序内存消耗是稳定的和小的。

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

我认为你的代码匹配示例1在这个链接http://www.ibm.com/developerworks/web/library/wa-memleak/模式

如果你以前没有在javascript中遇到过闭包,那么它们非常值得一读——理解它们可以解释很多乍一看似乎没有意义的行为。