jQuery (2.0.2) empty () html () Der Speicherverbrauch wächst ständig

8

Ich habe seit drei Tagen mit diesem Problem gekämpft und hoffe, dass jemand ein bisschen Information hat, die ich noch nicht gefunden habe, um mir zu helfen (ich bin verzweifelt!). Um einen Kontext zu bieten:

Browser: IE9.0.8112.16421 (64 Bit); jQuery-Version: 2.0.2

Im Wesentlichen mache ich einen einfachen Ajax-Aufruf und lese einige Informationen aus, die ich dann über den Erfolgs-Handler in ein Element einfüge. Die relevanten Codezeilen sind unten dargestellt:

%Vor%

Das Ziel entspricht dem folgenden HTML-Tag:

%Vor%

Die oben erwähnte auskommentierte Out for-Schleife soll das Problem vergrößern (was mit einzelnen Ereignis-Klick-Triggern schwer zu erkennen ist). Im Wesentlichen, wenn die Schleife vorhanden ist, geht der Speicher für einen einzelnen Aufruf von 46 MB auf ~ 113 MB.

Nachfolgende Aufrufe zeigen das gleiche Verhalten mit ständig wachsendem Speicher. Ich dachte zuerst, dass es ein Problem mit einem Event-Handler war, den ich nicht aufräumen konnte, aber dies ausschloss, da ich praktisch all meine JavaScript-Logik auskommentierte, so dass im Wesentlichen alles darunter ist (dh keine Event-Handler gebunden, keine benutzerdefinierten Objekte oder Funktionen) aufgerufen) - also kein Schließungsproblem.

Das Verschieben der for-Schleife außerhalb des Ajax-Aufrufs (so dass 1000 Ajax-Aufrufe gemacht werden) führt zum selben Speicherprofil (so dass irgendwelche obskuren Ajax-Speicherlecks ausgeschlossen sind). Der Inhalt, den ich einfüge, ist ein TD-Tag, der eine beträchtliche Menge an Inhalt enthält (d. H. Instanzen jedes HTML-Tags, an die man denken kann), also frage ich mich, ob der Inhalt, den ich einfüge, irgendwie für das Leck verantwortlich ist.

Ich habe einige interessante Blogposts über die Fähigkeit von IE gelesen, nach sich selbst aufzuräumen, einschließlich der folgenden, die am vielversprechendsten zu sein scheinen ( Ссылка ). Leider gibt es bisher keine Lösungen oder Workarounds.

Ich bin ratlos, da ich meine App bis auf die Knochen abgebaut habe und nicht viel mit $(...).empty().html(...) machen kann. Das Speicherleck ist langsam aber beständig ....

Ich habe auch versucht, nicht jQuery-Lösungen mit innerHTML, DOM-Methoden zu versuchen, die Tabellenzeile zu entfernen und sie neu zu erstellen und dann den Ajax-Inhalt in die Tabellenzellen einzufügen und den verworfenen Inhalt in einen Mülleimer DIV zu verschieben dann Aufruf innerHTML, alles ohne Erfolg, und in vielen Fällen das Leck schlimmer machen ...

    
JAMES 13.06.2013, 20:05
quelle

4 Antworten

0

Sehen Sie meinen letzten Kommentar oben, es scheint, dass ich wahrnahm, Speicherlecks seien nur Objekte, die darauf warten, gecodiert zu werden, aber aufgrund der Art meiner Anwendung (dh 99% der Navigation durch Ajax) war IE einfach nie Durchführen eines vollständigen GC, bis eine tatsächliche Seitennavigation erfolgt ist (z. B. window.top unloaded). Passiert dies beim Abmelden und plötzlich sinkt der Speicher für meine IE-Instanz von 200-63MB ... Ich habe versucht, manuell einen GC aufzurufen (aber das scheint nicht zu funktionieren ...). So für jetzt, jede nth Ajaxnavigation durch eine tatsächliche Seitennavigation zu ersetzen, um Sachen aufzuräumen ... nicht ideal, aber werde für den Moment tun, bis ich einen besseren Weg herausfinden kann.

    
JAMES 14.06.2013 23:49
quelle
0

Versuchen Sie, die jQuery-Lib zu aktualisieren, nur um zu überprüfen, ob es diesbezüglich Verbesserungen gibt.

Und entfernen Sie die Funktion "empty ()". Es ist nicht notwendig, denn html () überschreibt alle Schauer. Dies könnte Ihnen helfen, Speicherverbrauch zu vermeiden.

    
Broda Noel 19.11.2014 20:08
quelle
0

Haben Sie versucht, die empfangenen Daten in ein Wrapper-Element zu übertragen, das Sie während der nächsten Iteration entfernen?

%Vor%

Wenn es eine Art Leck gibt, das mit der clean() API zusammenhängt, werden Sie es los.

    
marcopeg 07.01.2015 12:14
quelle
0

Ich habe das gleiche Problem und löse so:

JQuery setInterval mit append, Speicher erhöhen

Sie müssen vergleichen, ob Daten mit dem Ziel übereinstimmen. Wenn nicht, füge Daten ein, sonst nichts.

    
lucasgabmoreno 26.01.2015 16:25
quelle