2015-02-17 4 views
5

Ich baue ein Javascript-Spiel, das ein ‚Ebene‘ Objekt mit var erstellt:Wie erkennt man, ob ein Objekt in JavaScript in Garbage Collection gesammelt wurde?

function start() { 
    var myGameLevel = new Level(2); 
} 

Dieses „Stufe()“ Objekt eine Vielzahl von Funktionen hat, in erster Linie Elemente auf das DOM hinzufügen und sie interaktiv zu machen. Eine Vereinfachung:

function Level(i) { 
    var _difficulty = i; 

    this.init = function(){ 
     jQuery("#container").append(...game elements here...); 
     jQuery("#button").on('click', function() {...}); 
    } 
} 

Meine Frage: wie kann ich wissen, ob die Stufe Objekt in der ‚Start‘ Funktion erstellt wurde Müll gesammelt oder nicht? Ich möchte nur "var" -Variablen verwenden, damit es keine externen Referenzen gibt. Wenn das DOM von allen Spielelementen gelöscht wird, ERWARTE ICH das "Level" -Objekt, das aus dem Speicher freigegeben werden soll, aber wie kann ich sicher sein?

+0

Wenn Sie Chrome verwenden, haben Sie die Speicherprofilerstellung im Debugger versucht? – dowomenfart

+0

Nun, ich bin mir nicht sicher, wonach ich suchen soll? Da das gesamte Level-Objekt anonym ist? Der Chrome-Debugger verfügt über eine Vielzahl von Bildschirmen, Listen und Optionen. Wo würde ich mein "Level" -Objekt finden? – Kokodoko

+0

@Kokodoko haben Sie eine Workaround? –

Antwort

3

Ich glaube nicht, dass Sie JavaScript Garbage Collection steuern können. Normalerweise kann eine Variable oder ein Objekt gesammelt werden, wenn keine Referenzen darauf vorhanden sind. Sie können also Ihre Chancen erhöhen, dass ein Objekt gesammelt wird, indem Sie Ihre Logik so gestalten, dass das Objekt nicht mehr in den Geltungsbereich fällt.

+0

Ich muss es nicht kontrollieren, ich will nur wissen, ob das Objekt GC'ed oder nicht ist. Da das Ganze anonym ist, kann ich nicht in der Konsole oder im Code darauf zugreifen, aber es könnte noch existieren. – Kokodoko

5

Schwache Referenzen are considered a security risk, und daher nicht verfügbar für nicht privilegierten Code in Browsern.

Diese Bedenken gelten nicht für privilegierten Code oder serverseitige Javascript-Ausführung, z. via node.js, und somit können plattformspezifische schwache Referenzimplementierungen für sie verfügbar sein.
Zum Beispiel Firefox Addons Components.utils.getWeakReference()

Für bestimmte Programmiermuster WeakMap/WeakSet ausreichend sein können, aber sie erlauben nicht das Programm Garbage Collection zu beobachten, weil dies zu tun wäre es einen Schlüssel brauchen, um diese Datenstrukturen zu untersuchen, sondern auf die Halte Schlüssel würde verhindern, dass die Objekte an erster Stelle gesammelt werden.

Ein zusätzliches Problem, das von JS-Implementierern geäußert wird, ist, dass abhängig davon, wie stark hypothetische schwache Ref-APIs sein würden - z. Es bietet Finalisierungsbenachrichtigungen - es könnte erhebliche Mengen an GC-Verhalten freisetzen, was wiederum zukünftige Implementierungen einschränken könnte, da ein verändertes Verhalten Web-Anwendungen beschädigen könnte.


Update: Es jetzt is a proposal zu schwache Verweise in JS zu standardisieren, die durch das Binden der Freisetzung von schwach erreichbaren Objekte zum JS Ereignisschleife die erkannten Risiken entschärft, so dass das Verhalten mehr deterministisch.

+0

Sie sagen also, dass ich eigentlich nie "var myLevel = Level()" verwenden sollte? Das mag ein guter Rat sein, aber die Frage steht immer noch: Nachdem ich myLevel auf null gesetzt habe, wie kann ich sicher sein, dass Thing() nicht immer noch Code ausführt? Ich finde es schwierig, im Chrome Inspector fest zu halten. – Kokodoko

+0

Nein, ich sage, der einzige Weg, um zu erkennen, dass etwas Müll gesammelt wurde, wären schwache Referenzen. Schwache Referenzen sind jedoch für nicht privilegierten Code nicht verfügbar. – the8472

+0

Wovon zum Teufel redest du?Nein, wo in diesem Link wird etwas über Sicherheitsrisiken erwähnt. –

Verwandte Themen