2009-08-02 10 views
2

Ich habe ein Gadget für Windows Sidebar geschrieben. Dies bedeutet im Wesentlichen, dass es sich um eine Miniaturseite handelt, die monatelang läuft.Wie erkennen, beheben, schließen Speicherverlust im Windows Sidebar Gadget?

Nach ein paar Wochen läuft die Speicherauslastung (Arbeitssatz) des Prozesses sidebar.exe, der Gadgets von Drittanbietern enthält, in die Hunderte von Megabyte.

Ohne eine Möglichkeit, die Quelle von Speicherlecks zu identifizieren, nehme ich einfach an, dass es das vermeintliche XMLHttpRequest-Schließungsproblem ist. Obwohl ich es in meinem Fall nicht asynchron mache. Also ich denke, es ist nur JAX eher als A JAX.

Die Javascript-Funktion, die Web-Hit beteiligt: ​​

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; 
} 

dies sieht es wie immer die Quelle für ein Speicherleck sein könnte?


Ich befürchte, dass ohne eine tatsächliche Schließung bin ich wieder auf Platz eins.

+1

Sie können Ihre gesamte Try Catch-Anweisung nur durch "xmlHttp = new XMLHttpRequest();" ersetzen. Nur die IE-Engine wird zum Anzeigen eines Gadgets verwendet. – ZippyV

Antwort

1

Dies ist ein bisschen eine späte Antwort, aber ich bemerkte, dass dies unbeantwortet geblieben war. Wenn Sie sich Ihren Code ansehen, laufen Sie synchron und es gibt keine Zirkelverweise. Ich bezweifle, dass dies die Quelle des Speicherlecks ist und es wahrscheinlich irgendwo anders in Ihrem Code ist. Ich bin auf Speicherlecks in Windows Desktop Gadgets gestoßen und die größte, die ich gefunden habe, ist das dynamische Hinzufügen von Skript-Tags zum Dokument (zum Beispiel wenn JSON-Callback-Methoden von einem Web-Service verwendet werden).

Übrigens, der Browser überprüft, dass Sie fast vollständig redundant ausgeführt werden. IE7, die niedrigste Version von IE, die unter Vista zulässig ist, führte das XMLHttpRequest() -Objekt ein (obwohl es von einem Benutzer oder Systemadministrator deaktiviert werden kann). Ich würde empfehlen, nur die folgende Zeile verwenden, sie zu ersetzen:

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


Zwei Jahre später, erhalte ich eine abstimmen hier und entdecken Sie die Frage und die Antwort fällt mir sofort. Ich erinnerte mich an die folgende Warnung für XMLHttpRequest auf den MDN-Tutorial sehen:

Hinweis: Sie nicht synchron XMLHttpRequests weil aufgrund der von Natur aus asynchronen Art der Vernetzung verwendet werden sollen, gibt es verschiedene Möglichkeiten, Speicher und Ereignisse können auslaufen wenn synchrone Anfragen verwendet werden.

Ich bin ein wenig zu kämpfen, um herauszufinden, ob dies durch einige zufällige Person wahr oder nur hinzugefügt wird, Angst zu helfen mongering (es ein Wiki ist, nachdem alle), aber vielleicht ist dies die Erklärung für Ihr Speicherleck . Auch

1

, DOM-Objekte und JavaScript-Objekte leben in verschiedenen Speicherplätze, wenn Sie also zirkuläre Referenzen haben wie

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

dann weder das Array noch die div jemals bekommen Müll gesammelt, auch wenn alle anderen Verweise auf Die beiden Objekte sind außer Reichweite geraten.

1

Ihre Frage ist zu alt, um davon betroffen zu sein, aber für jeden, der zufällig später darauf stößt ...

Windows 7 64bit SP1 eingeführt eine sidebar.exe Speicherverlust (und einige Leute berichten ähnliche Probleme in Vista). Die vorgeschlagene Problemumgehung in this blog post funktionierte für mich.

+0

Um den eigenen Autor dieses Blogs über seine eigene Problemumgehung zu zitieren, * "Jede Person mit einem gesunden Menschenverstand wird Ihnen sagen, dass sie das verdammte Problem nicht behebt" * –

+0

Ja. Deshalb wird es als Workaround und nicht als Fix bezeichnet. :) – Domchi

Verwandte Themen