【问题标题】:Memory leaks when using AJAX JSON call使用 AJAX JSON 调用时的内存泄漏
【发布时间】:2013-03-11 11:24:54
【问题描述】:

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

【问题讨论】:

  • 这不一定是内存泄漏,它可能只是浏览器缓存的问题。试着让它运行一段时间,看看它是否继续增长,甚至可能进入你的交换。如果是这样,那就是内存泄漏。如果它在一段时间后停止增长,这只是正常的浏览器行为。
  • 我已经测试了大约一个小时,当时它大约是 330MB,从 100MB 开始。也许在不同的浏览器中测试它?
  • JavaScript 是一种可以为您控制所有内存内容的语言。如果您认为您的代码中存在内存泄漏,那么您要么在某个全局对象中存储了大量数据,要么解释器有错误,要么这是预期的行为。由于您的代码未存储在全局对象中,并且浏览器在一小​​时后仅使用了约 330MB,我会说这是预期行为。

标签: javascript ajax json performance memory-leaks


【解决方案1】:

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

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

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

【讨论】:

  • 在回调结束时设置 http = null 是否足以释放内存?
  • @GHC 现在我尝试注释行:http.onreadystatechange = function() 并关闭,但仍然消耗 +- 相同数量的内存。
  • 你试过异步调用吗?无论如何,切换到异步可能是一个好主意,否则您几乎会连续阻塞 UI,因为您的代码每毫秒运行一次。见stackoverflow.com/questions/12214573/…
  • @kamylko 好吧,使用异步调用,你的代码必须有点不同......你需要在回调结束时设置new_message = input_for_ball,而不是现在的位置,因为如果调用是异步的,它就不会在你现在有那行的地方完成。
  • 我强烈建议在任何情况下都将其设为异步,除非您有充分的技术理由认为它必须是同步的...AJAX 以这种方式工作得更好,并且提供了更好的用户体验。
猜你喜欢
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-03
  • 2014-02-18
  • 1970-01-01
  • 2013-08-15
相关资源
最近更新 更多