2009-08-02 65 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