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?
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% 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%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.
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?
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%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%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%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.
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?
ok Ich habe einen Test-Kabelbaum dafür gebaut, er zieht nach dem Zufallsprinzip ein neues Bild und verwendet meinen Replace-Quellcode
Siehe Ссылка
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?
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.
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.
Tags und Links javascript html jquery ajax browser