Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/430.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用AJAX JSON调用时内存泄漏_Javascript_Ajax_Json_Performance_Memory Leaks - Fatal编程技术网

Javascript 使用AJAX JSON调用时内存泄漏

Javascript 使用AJAX JSON调用时内存泄漏,javascript,ajax,json,performance,memory-leaks,Javascript,Ajax,Json,Performance,Memory Leaks,在我的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 + "

在我的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
调用的实现中。当我使用
jqueryajax
调用时也发生了这种情况

2013年3月12日更新


正如下面提到的汤姆·范德·沃尔德(Tom van der Woerdt),这确实是一种有意的行为。因此,正如Matt B.所建议的,我重新编写了一些代码,使异步调用成为可能,这对我很有帮助。现在,我的应用程序内存消耗稳定且小。

我认为这不是AJAX调用,而是闭包消耗了内存。onreadystatechange函数引用http对象(因此匿名函数将保留对此对象的引用)。

我认为您的代码与此链接中示例1中的模式相匹配


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

这不一定是内存泄漏,可能只是浏览器缓存的问题。试着让它运行一段时间,看看它是否在继续增长,甚至是在你的掉期交易中。如果是,那就是内存泄漏。如果它在一段时间后停止增长,这只是正常的浏览器行为。我测试了大约一个小时,当时它是330MB,从100MB开始。也许可以在不同的浏览器中测试它?JavaScript是一种为您控制所有内存的语言。如果您认为代码中存在内存泄漏,则可能是将大量数据存储在某个全局对象中,或者是解释器有错误,或者是它的预期行为。由于您的代码不存储在全局对象中,并且浏览器在一小时后仅使用了~330MB,我认为这是预期行为。在回调结束时设置http=null是否足以释放内存?@GHC现在我尝试注释行:
http.onreadystatechange=function()
和闭包,并且仍然消耗+-相同的内存量。您是否尝试过异步调用?无论如何,切换到异步可能是一个好主意,否则,由于代码每毫秒运行一次,您几乎一直在阻塞UI。请参阅@kamylko。如果使用异步调用,您的代码必须有所不同……您需要在回调结束时设置
new\u message=input\u for\u ball
,而不是现在的位置,因为如果调用是异步的,它就不会在您现在的位置完成。我强烈建议在任何情况下都将其异步化,除非您有一个强烈的技术原因,即它必须是同步的……AJAX以这种方式工作得更好,并提供更好的用户体验。