2010-06-21 3 views
6

Das Buch Learning jQuery sagt IE Speicherverlust für das DOM-Objekt verfügt über eine Eigenschaft Referenzierung mit einer Funktion und die Funktion auch die DOM-Objekt referenziert, so dass eine „zirkuläre Referenz“ ist, wie folgt aus:Warum bleiben Speicherverluste im Internet Explorer bestehen, auch wenn Sie nicht auf Seiten navigieren?

onload = function() { 
    var foo = document.getElementById('foo'); 
    foo.onclick = function() { // DOM object foo's onclick property refers to a function 
     foo.innerHTML = "hello" // the function's body refers to the DOM object 
    }       // therefore circular reference 
} 

IE kann zirkuläre Verweise für die Garbage Collection verarbeiten, jedoch nicht, wenn die zirkulären Verweise sowohl das DOM-Objekt als auch das JavaScript-Objekt betreffen, da sie von verschiedenen Speichermanagern verarbeitet werden.

und:

[der Speicherverlust ... und] das resultierende [Referenz] Looping kann nicht von IE auch freigegeben werden, wenn wir von navigieren weg der Seite.

nie freigegeben, bis der Browser geschlossen ist.

Ist es wahr? Warum gibt IE diese Speicher nicht frei, selbst wenn ein Benutzer die Seite verlässt? Liegt es daran, dass der Benutzer auf Back klicken und auf die Seite zurückkehren kann und der IE den Status der Seite beibehalten möchte? In diesem Fall, was ist, wenn der Benutzer auf der Speicherleckseite ist und dann auf Back klickt, und dann google.com geht? Dann kann die Seite von keinem Back oder Forward angezeigt werden, und das Speicherverlustproblem kann verschwinden, ohne den Browser zu schließen?

Oder auch wenn die Registerkarte geschlossen ist, ohne den Browser zu schließen?

Tritt diese Art von Speicherverlust auch in IE 8 auf?

+0

Viele Programme haben Probleme mit Speicherlecks; und während viele Speicherlecks in neuere IE-Versionen gesteckt wurden, ist es schwierig, sie alle in ein Projekt dieser Größe zu stecken. – Piskvor

Antwort

3

Speicherlecks sind eine Klasse von Programmfehlern, also fragst du dich im Grunde "Warum ist IE Buggy?". Die Antwort darauf ist offensichtlich, "weil ein Programmierer irgendwo einen Fehler gemacht hat".

Während einige Browser absichtlich den Seitenstatus beibehalten, auch wenn Sie sich davon entfernen (insbesondere Opera und FF), bedeutet ein "Speicherleck" Speicher, den das Programm nicht mehr verwendet, aber vergessen hat zu veröffentlichen. In diesem Fall hat IE aufgehört, sich um diesen Teil des Speichers zu kümmern, hat dies aber dem Betriebssystem (Windows) nicht mitgeteilt, das es immer noch als "vom IE verwendet" ansieht. Dieser Teil des Speichers hängt also im Niemandsland, bis der Browser geschlossen wird - denn wenn der Browserprozess beendet wird, markiert das Betriebssystem den gesamten Speicher, der diesem Prozess zugewiesen wurde, als "frei".

Speicherlecks sind eine ziemlich heimtückische Art von Bug, weil das Programm korrekt zu funktionieren scheint, aber mehr und mehr Speicher verbraucht.

Siehe z.B. http://en.wikipedia.org/wiki/Circular_reference und http://en.wikipedia.org/wiki/Garbage_collection_(computer_science) für weitere Informationen zu diesem Thema.

+0

Haben diese "Zirkelbezüge" nicht den Geltungsbereich "Seitenebene"? Wenn also auf dieser Seite Speicher verloren geht und wir auf "Zurück" klicken und zu google.com gehen, "verschwindet" diese Seite im Wesentlichen von der "Zurück" - und "Vorwärts" -Sequenz, und wir können den gesamten Speicher für diese Seite freigeben. –

+0

@Jian Lin: Ja, so soll es * funktionieren *. Allerdings vergaß ein Programmierer von IE wahrscheinlich zu überprüfen, ob alle Seitenverweise korrekt freigegeben wurden, und während IE * denkt, dass es korrekt bereinigt wurde, hat es einige Daten im Speicher gelassen und weiß nicht mehr über sie. – Piskvor

+1

@Jian: Es wäre schön, wenn das funktioniert. Die Tatsache, dass dieses Problem weiterhin besteht, deutet jedoch darauf hin, dass entweder der Garbage Collector denkt, dass der Speicher noch ordnungsgemäß referenziert wird (obwohl vielleicht über eine unerwartete Route) oder dass der Garbage Collector zu dumm ist, um den Speicher zurückzufordern, oder sogar, dass kein Garbage Collector vorhanden ist . Es ist nicht möglich zu beurteilen, was das Problem ohne die Quelle zu IE ist (oder es zu dekompilieren, die eine schwache zweitbeste wäre). –

1

Das Leck ist da, weil einer der Programmierer der Anwendung (in diesem Fall IE) nicht ordnungsgemäß etwas entsorgen konnte (Objekt, Ressource), die Speicher verwendet wurde.

auf MSDN the three commonest causes of leaks in managed applications betrachtet:

  • Verweise auf verwaltete Objekte halten
  • nicht verwalteten Ressourcen freizugeben Failing
  • Andernfalls entsorgen Zeichnungsobjekte
Verwandte Themen