代码之家  ›  专栏  ›  技术社区  ›  Ian Boyd

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

  •  2
  • Ian Boyd  · 技术社区  · 15 年前

    几周后边栏.exe容纳第三方小工具的进程运行到数百兆字节。

    A 杰克斯。

    涉及web hit的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 回复  |  直到 15 年前
        1
  •  1
  •   Mike Stay    14 年前

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

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

        2
  •  1
  •   Domchi    13 年前

    你的问题太老了,不可能被这个问题所影响,但是对于任何后来碰巧遇到这个问题的人。。。

    this blog post

        3
  •  1
  •   Andy E    13 年前

    这是一个有点晚的答案,但我注意到这已经没有答案。看看你的代码,你是同步运行的,没有循环引用。我怀疑这是内存泄漏的源头,它很可能在代码的其他地方。我以前在Windows桌面小工具中遇到过内存泄漏,我发现的最大的一个漏洞是在文档中动态添加脚本标记时(例如,在web服务中使用JSON回调方法时)。

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

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


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