Javascript + IMG-Tags = Speicherleck. Gibt es einen besseren Weg, dies zu tun?

8

Ich habe eine Webseite, die jQuery verwendet, um einige Produktinformationen zu erhalten, während die Leute die Dinge betrachten und dann die letzten Produktbilder anzeigen, die sie gesehen haben. Dies ist in einem Jquery AJAX-Callback, der ungefähr so ​​aussieht:

%Vor%

Es scheint jedoch ziemlich viel Speicher zu verlieren. Visuell macht es das Richtige, aber der Fußabdruck wächst auf unbestimmte Zeit.

Der DOM-Inspektor von Safari zeigt, dass das DOM so ist, wie ich es erwarten würde, aber es scheint Referenzen auf jedes Bild zu haben, das es angezeigt hat (siehe dieser Screenshot falls jemand interessiert ist.

Ich habe

hinzugefügt %Vor%

zu der Entfernungserklärung, um keinen bemerkbaren Effekt zu sehen.

Gibt es irgendeine Magie, die nötig ist, damit der Browser etwas von diesem Zeug veröffentlichen kann?

    
Dustin 03.12.2008, 06:23
quelle

8 Antworten

2

Browser sind berüchtigt für Speicherlecks. Es klingt wie das Problem auftritt, wenn die Seite für eine lange Zeit ausgeführt wird. Wie wäre es mit der Aktualisierung der Seite, bevor der Speicher voll ist?

%Vor%     
Rob Colburn 12.05.2009 20:09
quelle
1

Können Sie versuchen, die Quelle des letzten Kindes zu ändern und zu sehen, ob das einen Unterschied macht? Sie können dieses Element dann als erstes untergeordnetes Element verschieben.

%Vor%     
redsquare 03.12.2008 06:53
quelle
1

Aus dem Mozilla Developer Center unter removeChild() :

  

Der entfernte untergeordnete Knoten ist immer noch im Speicher vorhanden, ist jedoch nicht mehr Teil des DOM. Sie können den entfernten Knoten später in Ihrem Code über den oldChild-Objektverweis wiederverwenden.

Dies ist der Schlüssel - verwenden Sie das entfernte Kind erneut, anstatt wiederholt ein neues Kind zu erstellen.

%Vor%     
Tomalak 03.12.2008 08:39
quelle
1

Ist der Fußabdruck wirklich ein Problem?

Ich vermute, dass Safari alle Bilder zwischenspeichert, solange Sie auf derselben Seite bleiben und Sie nichts dagegen tun können. Wenn Sie Glück haben, gibt Safari nach einem bestimmten Limit nicht benötigte Objekte frei.

Der Grund für dieses Verhalten ist, dass Safari denkt, dass diese Bilder wahrscheinlich ein zweites Mal verwendet werden und sie daher zwischengespeichert werden.

    
Georg Schölly 12.05.2009 19:23
quelle
0

Wie lange haben Sie beobachtet, dass das auf unbestimmte Zeit wächst? Einige Implementierungen von Garbage Collectors geben dem Betriebssystem nicht unbedingt so schnell Speicher zurück, wenn überhaupt. Kannst du das, was du versuchst, zu einem wirklich einfachen Test destillieren (zB src des Bildes immer wieder neu setzen) ohne Ajax oder Callbacks? Hast du / kannst du das mit den anderen Browsern versuchen?

    
Scott Evernden 03.12.2008 07:19
quelle
0

ok Ich habe einen Test-Kabelbaum dafür gebaut, er zieht nach dem Zufallsprinzip ein neues Bild und verwendet meinen Replace-Quellcode

Siehe Ссылка

    
redsquare 03.12.2008 08:39
quelle
0
___ answer854624 ___

Browser sind berüchtigt für Speicherlecks. Es klingt wie das Problem auftritt, wenn die Seite für eine lange Zeit ausgeführt wird. Wie wäre es mit der Aktualisierung der Seite, bevor der Speicher voll ist?

%Vor%     
___ qstnhdr ___ Javascript + IMG-Tags = Speicherleck. Gibt es einen besseren Weg, dies zu tun? ___ answer336513 ___

Aus dem Mozilla Developer Center unter %code% :

  

Der entfernte untergeordnete Knoten ist immer noch im Speicher vorhanden, ist jedoch nicht mehr Teil des DOM. Sie können den entfernten Knoten später in Ihrem Code über den oldChild-Objektverweis wiederverwenden.

Dies ist der Schlüssel - verwenden Sie das entfernte Kind erneut, anstatt wiederholt ein neues Kind zu erstellen.

%Vor%     
___ answer336374 ___

Können Sie versuchen, die Quelle des letzten Kindes zu ändern und zu sehen, ob das einen Unterschied macht? Sie können dieses Element dann als erstes untergeordnetes Element verschieben.

%Vor%     
___ answer854410 ___

Ist der Fußabdruck wirklich ein Problem?

Ich vermute, dass Safari alle Bilder zwischenspeichert, solange Sie auf derselben Seite bleiben und Sie nichts dagegen tun können. Wenn Sie Glück haben, gibt Safari nach einem bestimmten Limit nicht benötigte Objekte frei.

Der Grund für dieses Verhalten ist, dass Safari denkt, dass diese Bilder wahrscheinlich ein zweites Mal verwendet werden und sie daher zwischengespeichert werden.

    
___ qstntxt ___

Ich habe eine Webseite, die jQuery verwendet, um einige Produktinformationen zu erhalten, während die Leute die Dinge betrachten und dann die letzten Produktbilder anzeigen, die sie gesehen haben. Dies ist in einem Jquery AJAX-Callback, der ungefähr so ​​aussieht:

%Vor%

Es scheint jedoch ziemlich viel Speicher zu verlieren. Visuell macht es das Richtige, aber der Fußabdruck wächst auf unbestimmte Zeit.

Der DOM-Inspektor von Safari zeigt, dass das DOM so ist, wie ich es erwarten würde, aber es scheint Referenzen auf jedes Bild zu haben, das es angezeigt hat (siehe dieser Screenshot falls jemand interessiert ist.

Ich habe

hinzugefügt %Vor%

zu der Entfernungserklärung, um keinen bemerkbaren Effekt zu sehen.

Gibt es irgendeine Magie, die nötig ist, damit der Browser etwas von diesem Zeug veröffentlichen kann?

    
___ answer336514 ___

ok Ich habe einen Test-Kabelbaum dafür gebaut, er zieht nach dem Zufallsprinzip ein neues Bild und verwendet meinen Replace-Quellcode

Siehe Ссылка

    
___ answer336408 ___

Wie lange haben Sie beobachtet, dass das auf unbestimmte Zeit wächst? Einige Implementierungen von Garbage Collectors geben dem Betriebssystem nicht unbedingt so schnell Speicher zurück, wenn überhaupt. Kannst du das, was du versuchst, zu einem wirklich einfachen Test destillieren (zB src des Bildes immer wieder neu setzen) ohne Ajax oder Callbacks? Hast du / kannst du das mit den anderen Browsern versuchen?

    
___ tag123jquery ___ jQuery ist eine beliebte Cross-Browser JavaScript-Bibliothek, die durch die Minimierung der Abweichungen in allen Browsern Document Object Model (DOM) Traversal, Ereignisverarbeitung, Animationen und AJAX-Interaktionen ermöglicht. Eine mit jQuery gekennzeichnete Frage sollte mit jQuery in Zusammenhang stehen, daher sollte jquery von dem fraglichen Code verwendet werden, und mindestens eine jquery-nutzungsbezogene Elemente müssen in der Frage enthalten sein. ___ answer33610 ___

Dustin, Es scheint, dass die insertBefore-Anweisung in meinem Code einige Probleme verursacht hat. Wenn Sie diesen weiteren Testfall sehen, bleibt die Speichernutzung ziemlich statisch, obwohl ich das letzte Kind lege und ein neues neues dom-Fragment einfüge. Führt besser aus als der letzte Versuch.

Ссылка

    
___ tag123javascript ___ JavaScript (nicht zu verwechseln mit Java) ist eine dynamische Sprache mit mehreren Paradigmen auf hoher Ebene, die sowohl für das clientseitige als auch für das serverseitige Scripting verwendet wird. Verwenden Sie dieses Tag für Fragen zu ECMAScript und seinen verschiedenen Dialekten / Implementierungen (außer ActionScript und Google-Apps-Script). ___ answer21600890 ___

Wie ich kürzlich herausgefunden habe, gibt es einen Bug in Firefox, der verwaiste IMG-Tags zum Lecken bringt.

Dies kann umgangen werden, indem die Bilder in CSS verschoben werden:

%Vor%

Überprüfen Sie, ob dies Ihr Speicherleck behebt.

    
___ tag123ajax ___ AJAX (Asynchrones JavaScript und XML) ist eine Technik zum Erstellen nahtloser interaktiver Websites über den asynchronen Datenaustausch zwischen Client und Server. AJAX erleichtert die Kommunikation mit dem Server oder partielle Seitenaktualisierungen ohne eine herkömmliche Seitenaktualisierung. ___ tag123html ___ HTML (Hyper Text Markup Language) ist die Standard-Auszeichnungssprache, die zum Strukturieren von Webseiten und zum Formatieren von Inhalt verwendet wird. HTML beschreibt die Struktur einer Website semantisch zusammen mit Hinweisen für die Präsentation, wodurch sie eine Markup-Sprache statt einer Programmiersprache wird. Die neueste Revision der HTML-Spezifikation ist HTML5.2. ___ tag123browser ___ Ein Webbrowser oder Internetbrowser ist eine Softwareanwendung zum Abrufen, Präsentieren und Durchlaufen von Informationsressourcen im World Wide Web. ___
redsquare 03.12.2008 09:27
quelle
0

Wie ich kürzlich herausgefunden habe, gibt es einen Bug in Firefox, der verwaiste IMG-Tags zum Lecken bringt.

Dies kann umgangen werden, indem die Bilder in CSS verschoben werden:

%Vor%

Überprüfen Sie, ob dies Ihr Speicherleck behebt.

    
Willem M. 06.02.2014 10:56
quelle

Tags und Links