2009-08-02 30 views
2

我已经为Windows边栏写了一个小工具。这基本上意味着它是一个微型网页,运行数月。如何识别,修复,关闭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; 
} 

这是否看起来它可能永远不会出现内存泄漏的来源是什么?


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

+1

您可以用“xmlHttp = new XMLHttpRequest();”替换您的整个Try Catch语句。只有IE引擎用于显示小工具。 – ZippyV 2009-08-02 13:56:59

回答

1

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

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

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


两年后,我在这里得到了一票,并重新发现的问题,答案发生,我马上。我记得看到了XMLHttpRequest的在MDN教程以下警告:

注:你不应该使用同步XMLHttpRequest的,因为,由于网络固有的异步性,有各种方法内存和事件可能泄漏当使用同步请求时。

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

1

此外,DOM对象和JavaScript对象居住在不同的存储空间,所以如果你有一个像

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

则两个数组也不那么div会永远得到垃圾收集,即使所有的引用循环引用这两个对象已经超出了范围。

1

你的问题太旧了,不会受到这个影响,但对于任何碰巧碰到它的人......

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

+0

引用该博客自己的作者有关他自己的解决方法,*“任何有常识的人都会告诉你它不能解决该死的问题”* – 2011-09-21 13:45:07