Hi,
Wenn du ein Teil des DOMs auswechselst (appendChild/removeChild, innerHTML usw.), so zerstörst du damit i.d.R. auch die alten DOM-Objekte.
Verweisen diese DOM-Objekte auf Handlerfunktionen, so wird diese Referenz mit zerstört.
Verweist kein weiteres Objekt mehr auf die Funktionen, so ist die Anzahl der Referenzen 0 und sie können vom GC abgeräumt werden.
Mein Screen-Objekt bleibt eigentlich während der gesamten Dauer der Applikation im Speicher, das sollte eigentlich nicht zerstört werden.
Mir ging es eher um die alten, nicht mehr benutzten DOM-Objekte. Es wäre sehr ärgerlich, wenn diese einfach weiter im Speicher bleiben würden und somit nach und nach diesen zukleistern, obwohl die Elemente nicht mehr angezeigt werden (und auch nicht irgendwie angedacht ist, diese zu recyceln: im Falle eines Wiederaufrufs einer Sicht erzeuge ich diese einfach neu).
Verwendest du jQuery für Event-Handling und DOM-Operationen, so werden Event-Listener immer entfernt, bevor das DOM-Element aus dem Baum entfernt wird. Das ist die besonders sichere und speicherschonende, wenn auch weniger performante Methode.
Ich teste momentan mit der Closure-Library herum und lese in diesem Zusammenhang Closure: The Definitive Guide. Bolin (der Autor) hat nun an deutlich größeren Projekten gearbeitet als meine Applikation je erreichen wird, aber da es durchaus sein kann, dass meine App tage- wenn nicht wochenlang durchläuft, will ich wenigstens sichergehen, dass solche einfachen Fälle an unnötigem Speicherverbrauch nicht auftreten.
Closure enthält extra Funktionen, um einfacher mit dem Release von Listenern zurechtzukommen. Bolin schreibt auch ein eigenes Kapitel über die goog.Disposable-Klasse.
Dadurch bin ich ehrlich gesagt ein wenig aufgeschreckt. Und ich mache mir ein wenig Sorgen, dass durch die ganzen verwendeten Closures viel zu viel Zeugs im Speicher gehalten wird, weil es noch in irgendwelchen Scopes von Listenern rumgammelt -.-.
gibt es für den Firefox oder einen anderen Browser eine einfache Möglichkeit, den Speicherverbrauch der aktuellen Seite bzw. von JavaScript-Objekten anzuzeigen? Oder vielleicht sogar, was insgesamt so im Speicher rumfliegt?
Schau dir einmal den Profiles-Tab des Web Inspectors an (Safari, Chrome). Im Heap Snapshot kannst du genau sehen, womit der Speicher gefüllt ist.
Danke.
Bis die Tage,
Matti