2012-03-24 23 views
13

Ich bin ziemlich sicher, dass ich Speicherlecks mit KO Version 2.0 habe. Ich habe ein beobachtbares Array, das mit dem Ergebnis eines AJAX-Aufrufs gefüllt ist. Diese Sammlung ist datengebunden mit einem für jeden zu einem DIV-Container. Jedes Objekt im Array hat einen einzelnen beobachtbaren Wert, der an ein Kontrollkästchen gebunden ist. Ich habe den Heap mit Chrome untersucht und meine Schlussfolgerung lautet wie folgt:KnockoutJS Speicherleck

Wenn der AJAX-Aufruf 3 Elemente zurückgibt, werden sie ordnungsgemäß im DOM gerendert. Wenn ich zu diesem Zeitpunkt einen Snapshot des Heapspeichers mache, sind dort drei SearchResult Objekte enthalten. Wenn ich den AJAX-Aufruf erneut triggert und 5 Elemente zurückgibt, werden alle 5 korrekt zum DOM gerendert. Wenn ich jedoch einen Snapshot des Heapspeichers in Chrome mache und sie vergleiche, werden 8 Elemente als noch auf dem Heap gespeichert aufgelistet, die alle als "hinzugefügt" aufgelistet sind und keine als "gelöscht" aufgelistet sind. Die DOM-Anzeige ist immer korrekt, aber die Speicherbelegung bleibt einfach weiter steigen und klettern, da die alten Suchergebnisse nie freigegeben werden.

Kann mir jemand helfen oder mir Hinweise zur Diagnose des Speicherlecks geben?

UPDATE

Ich habe ein jsFiddle erstellt das Wesentliche zu zeigen, was ich tue. Ich habe ALLES außer der Kernfunktionalität gestreift und ich kann immer noch das Speicherleck duplizieren, wenn es auf meinem lokalen Rechner läuft. Offensichtlich wird der Code nicht funktionieren, da er gepostet wird, weil er meinen lokalen Server treffen muss, um die Suche auszuführen.

UPDATE 2

Ich zog die neueste 2.1.0.0 Beta-Version und das Leck verschwunden. Ich bin kein großer Fan der Beta-Version der Dinge oder der klassischen "nur auf die neue Version aktualisieren" -Fix. Ich bin immer noch sehr daran interessiert zu wissen, was sich geändert hat oder was ich falsch gemacht habe, was das Leck verursacht hat.

+2

behoben worden gehen Ist es tatsächlich zu halten, bis es aus dem Speicher läuft? JS-Engines sammeln nicht sofort Müll, also könnte es passieren, dass die Engine den GC nicht ausführt, da noch genügend Speicher vorhanden ist. –

+0

Ich habe meine Website mit mehr als 450 MB verwendet. Würde die Engine nicht immer mehr Speicher verbrauchen, bis keine vom Betriebssystem festgelegte Zuweisung mehr möglich wäre? Bedeutet das nicht, dass das Betriebssystem den Browser mehr und mehr Speicher verwenden würde, bis der Computer abstürzt? Wie würde ich testen, um festzustellen, ob der Arbeitsspeicher erschöpft ist? – arb

+0

Das Verhalten ist schwer vorherzusagen. Du könntest versuchen, den Ajax-Call immer und immer wieder durchlaufen zu lassen und zu sehen, ob er immer mehr Speicher verbraucht. Könnte helfen, wenn Sie versuchen, den Code in einen kleinen Testfall zu reduzieren, den Sie in Ihre Frage einfügen können und wenn es sich herausstellt, dass es ein Leck ist, sollte es wahrscheinlich auch an KO-Entwickler gesendet werden. –

Antwort

10

Sie tun nichts falsch, es sieht aus wie ko.cleanNode ignorierte foreach Bindings und nicht ordnungsgemäß Entsorgung der veralteten Objekte innerhalb der aktualisierten observableArray.

https://github.com/SteveSanderson/knockout/issues/271

Die in 2.1.0beta

+3

Das [Problem, auf das du dich beziehst] (https://github.com/SteveSanderson/ knockout/issues/271) wurde geschlossen, weil der Reporter den Knockout falsch benutzt hat. Man sollte applyBindings() nicht mehr als einmal auf demselben (n) DOM-Knoten aufrufen. – GregT