如何在使用定期AJAX / XMLHttpRequest调用时修复浏览器的内存增长?

我在整个周末度过了在Dojo写的Web应用程序中阐述内存增长问题.

Web应用程序将“永远运行”,因此不会重新启动浏览器.

应用程序定期从服务器(无跨域)更新动态数据;每5秒钟进行一次AJAX调用,以检索新数据为JSON.

通过让应用程序运行几个小时,我观察到浏览器内存不断增长(最新的Chrome和Firefox都在最新的Windows和Mac OS X上).

起初,我以为Dojo正在引起这种行为.实际上,通过使用XMLHttpRequest对象切换到本机实现,我可以大大减少内存增长,但它仍然存在.随着每个AJAX请求,内存都在增长一点(约4-8KB).

我已经尝试过:

我有

> …试图使用其他框架,如jQuery,YUI等 – 没有影响
> …切换到使用本机的XMLHttpRequest对象 – 帮助了很多但不完全
> …取消数据后停用DOM操作 – 无效果
> …通过设置为“null”并将其重新设置为“xhr”,并在每次迭代后删除它 – 无效果
> …在每次迭代后将onreadystatechange处理程序重置为null或空方法 – 无效果
> …重复使用`xhr`对象和`onreadystatechange`处理程序,因为它总是相同的 – 没有任何效果

所以即使我没有做任何事情(也如下面第一个StackOverflow链接中所述)与加载的数据,内存使用量增加

我已经看过:

> Memory Leak with an XMLHttpRequest and setInterval
> Automatic web-page refresh memory leak using XMLHttpRequest
> Memory-leak at a wrapped XMLHttpRequest function
> http://forum.jquery.com/topic/memory-leaks-with-ajax-calls
>还有更多…

我的测试HTML代码

<!DOCTYPE html>
<html>
<head>
    <Meta charset="utf-8">
    <title>Native XHR Async</title>
</head>
<body>
<script>

var update = document.createElement("div");
document.body.appendChild(update);

var timeout = null;
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = onReadyState;

function loadData()
{
    xhr.open("GET","memory-leak.json?" + new Date().getTime());
    xhr.send(null);
}

function onReadyState()
{
   if (this.readyState === 4)
   {
       if( this.status === 200 )
       {
           update.innerHTML = "";
           update.innerHTML = this.responseText;
       }

       if( timeout !== null )
       {
           clearTimeout(timeout);
           delete timeout;
       }

       timeout = setTimeout(loadData,1000);
   }       
}

loadData();

</script>

</body>
</html>

和我的测试JSON(在同一个目录):

{
    "errorstatus":"Okay","B0":{"P":"0 Watt"},"E0":{"P":"28 Watt"},"Z0":{"P":"28 Watt"},"S0":{"P":"0 Watt","SOC":"74%"},"Z1":{"P":"0 Watt"},"R0":0,"R1":0,"R2":0,"date":"29.09.2012 09:23:19","Version":"Sep 28 2012-15.22"
}

我没有任何解释这个问题,所以任何帮助是非常感谢.如果您需要任何进一步的信息,请不要犹豫,问我.

XmlHttpRequest将缓存每个响应,这就是为什么要添加日期以使该URL唯一.

高速缓存正常写入磁盘,同时也将保存在一个XmlHttpRequest中,只要它存在就发出请求.

您应该使用每个请求的实例并将其销毁,否则,请确保通过编译指示和xhr设置禁用缓存.

相关文章

IE6是一个非常老旧的网页浏览器,虽然现在很少人再使用它,但...
PHP中的count()函数是用来计算数组或容器中元素的个数。这个...
使用 AJAX(Asynchronous JavaScript and XML)技术可以在不...
Ajax(Asynchronous JavaScript and XML)是一种用于改进网页...
本文将介绍如何通过AJAX下载Excel文件流。通过AJAX,我们可以...
Ajax是一种用于客户端和服务器之间的异步通信技术。通过Ajax...