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中,只要它存在就发出请求.
您应该使用每个请求的实例并将其销毁,否则,请确保通过编译指示和xhr设置禁用缓存.