molily: Garbage Collector bei Listenern, wenn EventTarget entfernt wird

Beitrag lesen

Wenn ich sämtliche Referenzen auf mein Screens-Objekt entferne, dann wird es trotzdem nicht entsorgt, da durch das binding der listener-Funktionen diese noch aufgerufen werden könnten. Um mein Objekt also tatsächlich zu entsorgen, muss ich alle Listener entfernen.

Richtig. Sonst bleiben die Listener vom GC verschont. Wenn diese noch per Closure Daten einschließen (z.B. das zugehörige Objekt durch Binding), dann bleiben auch diese im Speicher.

Das Objekt hat eine Referenz auf meinen Element-Knoten, in dem ich den Inhalt darstellen will und ersetzt beim Anzeigen einfach dessen Inhalt durch den Neuen.
Wird dadurch auch der Garbage Collector für den alten Inhalt aufgerufen? Oder bleibt dieser im Speicher, da noch durch die Listener Referenzen dafür vorliegen?

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.

Der GC läuft periodisch, daher kann das tatsächliche Löschen aus dem Speicher etwas später erfolgen.

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.

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.

Mathias