如何在Windows边栏小工具中识别,修复,关闭内存泄漏?

时间:2009-08-02 12:40:03

标签: memory-leaks closures sidebar windows-desktop-gadgets

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

几周后,包含第三方小工具的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;
}

这看起来是否会成为内存泄漏的来源?


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

3 个答案:

答案 0 :(得分:1)

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

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

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

<小时/> 两年后,我在这里得到了一个投票,并重新发现了问题,答案立即发生在我身上。我记得在XMLHttpRequest的MDN教程中看到以下警告:

  

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

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

答案 1 :(得分:1)

此外,DOM对象和JavaScript对象存在于不同的内存空间中,因此如果您有像

这样的循环引用
  table = [];
  table[0] = document.getElementById('myDiv');
  table[0].ownerTable = table;

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

答案 2 :(得分:1)

你的问题太老了,不能受此影响,但对于碰巧碰到它的人来说......

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