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

Try Catch文全体を "xmlHttp = new XMLHttpRequest();"だけで置き換えることができます。ガジェットの表示にはIEエンジンのみが使用されます。 – ZippyV

答えて

1

これは少し遅れた回答ですが、これは未回答でした。コードを見ると、同期して実行されており、循環参照はありません。私はそれがメモリリークの原因であるとは思わないし、あなたのコードのどこかにある可能性が高い。以前はWindowsデスクトップガジェットのメモリリークに遭遇しました。ドキュメントにスクリプトタグを動的に追加したとき(たとえば、WebサービスからJSONコールバックメソッドを使用している場合など)には最大のものでした。

ちなみに、実行中のブラウザのチェックはほぼ完全に冗長です。 Vista上で許容されるIEの最低バージョンであるIE7は、XMLHttpRequest()オブジェクトを導入しました(ただし、ユーザーまたはシステム管理者は無効にできます)。

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


2年後、私はここまで票を取得し、質問を再発見し、答えはすぐに私に発生します。私はちょうどそれを置き換えるために以下の1行を使用することをお勧めします。私はXMLHttpRequestのためにMDNチュートリアルの次の警告を見て思い出した:

注:によるネットワーキングの本質的に非同期性を、様々な方法でメモリやイベントがある、ので、あなたが同期のXMLHttpRequestsを使うべきではありませんが漏れることができます同期要求を使用する場合

私はこれが真実であるか、または恐怖の混乱を助けるためにランダムな人物によって追加されたのか少し調べるために苦労していますが、これはおそらくあなたのメモリリークの説明です。

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で提案されている回避策が私に役立った。

+0

ブログの作成者に自分の回避策を伝えるために、* "常識を傾けている人なら誰でも、問題が解決しないと伝えます" * –

+0

だからこそ解決策ではなく回避策と呼ばれています。 :) – Domchi

関連する問題