Javascript Speicherlecks nach dem Entladen einer Webseite

8

Ich habe gelesen, um zu versuchen, Speicherlecks in Browsern, insbesondere in Speicherlecks, Sinn zu machen. IE. Ich verstehe, dass die Lecks durch eine fehlende Übereinstimmung in Garbage-Collection-Algorithmen zwischen der Javascript-Engine und der DOM-Objektstruktur verursacht werden und bestehen bleiben. Was ich nicht verstehe ist, warum (nach einigen Aussagen in den Artikeln, die ich gerade lese) der Speicher nicht zurückgewonnen wird, nachdem die Seite vom Browser entladen wurde. Wenn Sie sich von einer Webseite entfernen, sollten Sie zu diesem Zeitpunkt alle DOM- und JavaScript-Objekte aus dem Gültigkeitsbereich herausnehmen, oder?

    
ykaganovich 03.07.2009, 05:06
quelle

3 Antworten

8

Hier ist das Problem. IE hat einen separaten Garbage Collector für das DOM und für Javascript. Sie können keine Zirkelbezüge zwischen den beiden erkennen.

Früher mussten wir alle Event-Handler von allen Knoten beim Seitenentladen bereinigen. Dies könnte jedoch den Browser beim Entladen anhalten. Dies adressierte nur den Fall, in dem der Zirkelverweis von Event-Handlern verursacht wurde. Es könnte auch durch das Hinzufügen direkter Referenzen von DOM-Knoten zu js-Objekten verursacht werden, die einen Verweis auf den DOM-Knoten selbst hatten.

Eine weitere gute Sache ist, dass wenn Sie Knoten löschen, es eine gute Idee ist, die Handler zuerst selbst zu entfernen. Ext-js hat eine Ext.destroy-Methode, die genau das tut (wenn Sie die Handler mit ext gesetzt haben).

Beispiel

%Vor%

Dann hat Microsoft IE gehackt, so dass es beim internen Entladen alle Event-Handler und Expando-Eigenschaften entfernt hat, daher ist es viel schneller als mit js. Dieser Fix schien unsere Speicherprobleme zu lösen, aber nicht alle Probleme, da es immer noch Leute gibt, die das Problem haben.

MS Beschreibung des Problems

MS veröffentlicht einen Patch, der Speicherlecks "behebt":

Blog über feste Speicherlecks

IE hat immer noch einige Probleme

In unserem Unternehmen verwenden wir ext-js. Indem wir immer Event-Handler mit ext-js setzen, die eine interne Aufräumroutine haben, haben wir keine Speicherlecks erfahren. In Wirklichkeit nimmt die Speicherauslastung zu, bleibt jedoch bei etwa 250 MB für eine Maschine mit 4 GB RAM. Wir denken nicht, dass das schade ist, da wir etwa 2 MB (unkomprimiert) von js-Dateien laden und alle Elemente auf der Seite dynamisch sind.

Es gibt eine Menge darüber zu sagen und wir haben das ausgiebig recherchiert, wo ich arbeite. Fühlen Sie sich frei, eine spezifischere Frage zu stellen. Ich kann dir vielleicht helfen.

    
Juan Mendes 11.12.2009, 07:10
quelle
3

Das Beste, was ich je über Javascript-Speicherlecks gelesen habe, wurde von Doulgas Crockford geschrieben.

Um Ihre Frage zu beantworten, ja, sollte der Browser absolut alle Objekte (und vor allem Event-Handler) zum richtigen Zeitpunkt entladen. Wenn es so wäre, hätte es keine Lecks :)

    
Josh Stodola 03.07.2009 05:22
quelle
0

Sie müssen keinen Sinn für sie haben - sie sind Bugs in Broswers und werden von Versionen zu Versionen behoben.

    
J-16 SDiZ 03.07.2009 06:40
quelle