【发布时间】: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