2

我为 Windows 边栏写了一个小工具。这实质上意味着它是一个微型网页,可以连续运行数月。

几周后,容纳第 3 方小工具的 sidebar.exe 进程的内存使用量(工作集)达到数百兆字节。

如果无法确定内存泄漏的来源,我只是假设它是传闻中的 XMLHttpRequest 闭包问题。尽管在我的情况下我不是异步执行的。所以我想这只是JAX而不是A JAX。

涉及网络点击的javascript函数:

function FetchXML(method, url)
{
   var xmlHttp;
   try
   {
      // Firefox, Opera 8.0+, Safari  
      xmlHttp=new XMLHttpRequest();  
   }
   catch (e)
   {  // Internet Explorer  
      try
      {
         xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");    
      }
      catch (e)
       {
         try
         {
            xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");      
         }
         catch (e)
         {
            throw "XMLHttp not supported"
         }
      }
   }

   xmlHttp.open(method, url, false);
   xmlHttp.send(null);  
   if (xmlHttp.status != 200)
   {
      throw "Server returned status code "+xmlHttp.status.toString();
   }

   if (xmlHttp.responseXML.parseError.errorCode != 0)
   {
      throw "Error in returned XML: "+xmlHttp.responseXML.parseError.reason;
   }

   var responseXML = xmlHttp.responseXML;
   xmlHttp = null;
   return responseXML;
}

这看起来是否可能是内存泄漏的根源?


我担心如果没有真正的关闭,我会回到原点。

4

3 回答 3

1

这是一个迟到的答案,但我注意到这没有得到答复。查看您的代码,您正在同步运行并且没有循环引用。我怀疑这是内存泄漏的根源,它很可能在您的代码中的其他地方。我以前在 Windows 桌面小工具中遇到过内存泄漏,我发现最大的一个是在向文档动态添加脚本标签时(例如,当使用来自 Web 服务的 JSON 回调方法时)。

顺便说一句,您正在运行的浏览器检查几乎是完全多余的。IE7 是 Vista 上允许的最低 IE 版本,引入了 XMLHttpRequest() 对象(尽管用户或系统管理员可以禁用它)。我建议只使用以下单行来替换它:

xmlHttp = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");


两年后,我在这里获得了赞成票,并重新发现了这个问题,答案马上就出现在了我的脑海中。我记得在 XMLHttpRequest 的 MDN 教程中看到以下警告:

注意:您不应该使用同步 XMLHttpRequests,因为由于网络固有的异步特性,使用同步请求时内存和事件可能会以多种方式泄漏。

我正在努力找出这是真的还是只是由一些随机的人添加以帮助散布恐惧(毕竟这是一个维基),但也许这就是你的内存泄漏的解释。

于 2009-10-16T14:39:49.527 回答
1

此外,DOM 对象和 JavaScript 对象存在于不同的内存空间中,所以如果你有循环引用,比如

  表 = [];
  表[0] = document.getElementById('myDiv');
  表[0].ownerTable = 表;

那么数组和 div 都不会被垃圾回收,即使对这两个对象的所有其他引用都超出了范围。

于 2010-09-17T17:50:40.173 回答
1

你的问题太老了,不会受到影响,但对于以后碰巧遇到它的人来说......

Windows 7 64bit SP1 引入了 sidebar.exe 内存泄漏(有些人报告在 Vista 中发生了类似的问题)。此博客文章中建议的解决方法对我有用。

于 2011-09-18T07:17:35.670 回答