2016-11-06 2 views
5

Wenn ich den folgenden Code haben:Müssen primitive Werte für die Grabage-Sammlung aufgehoben werden?

function MyClass() { 
    this.data = { 
     // lots of data 
    }; 
} 

var myClassInstace = new MyClass(); 

var myobj = { 
    num:123, 
    str:"hello", 
    theClass:myClassInstance 
}; 

Ich weiß, es ist absolut notwendig zu tun:

myobj.theClass = null; 

Um myClassInstance und seine data Eigenschaft für GC frei. Was soll ich aber mit myobj.num und myobj.str machen? Muss ich ihnen auch einen Wert von null geben? Ändert die Tatsache, dass sie primitiv sind, irgendetwas in Bezug auf GC?

+0

Möchten Sie "myobj" beibehalten, aber sicherstellen, dass alle seine Werte keinen Speicher belegen oder möchten Sie "myobjt" vollständig aus dem Speicher löschen? – vlaz

+0

"Ich weiß, dass es absolut notwendig ist zu tun:' myobj.theClass = null; '..." ** Nein, ist es nicht. ** –

+0

Ja, ich möchte "myobj" vollständig abwischen. Und wenn ich ** das ** tun will, bin ich mir ziemlich sicher, dass es notwendig ist, 'myobj.theClass = null 'zu tun, wenn ich keine Speicherlecks verursachen will. –

Antwort

3

Die JavaScript-Laufzeitumgebung, die die Garbage Collection implementiert, kann Objekte sammeln, sobald Werte nicht mehr aus dem Code erreichbar sind. Dies gilt sowohl für Objektreferenzen als auch für Primitive. Die Details des genauen Zeitpunkts, zu dem das Element erfasst wird, variieren je nach Implementierung, aber es ist nicht einmal erforderlich, die Objektreferenzen auf null zu setzen (wie Sie angeben), es sei denn, Sie benötigen das Objekt früher als die natürliche Beendigung der aktuellen Funktion.

Dies alles verbindet das grundlegende Konzept von "Scope" und der Scope Chain. Wenn sich ein Element nicht mehr in einer anderen Objektbereichskette befindet, kann es gesammelt werden. Dies klar zu verstehen, wird diese Frage beantworten und auch dazu beitragen, Verschlüsse zu verstehen, bei denen es sich um Szenarien handelt, in denen Elemente länger im Speicher verbleiben als erwartet.

+1

Sagen, dass Javascript Referenzzählung verwendet, ist falsch. Erstens ist JavaScript eine Sprache, keine Implementierung. Verschiedene Implementierungen können unterschiedliche Arten von Speicherbereinigung verwenden. Zweitens, V8 verwendet zumindest keine Referenzzählung, es verwendet einen Generationskollektor mit einem Mark and Sweep-Algorithmus. http://jaycontrod.com/posts/55/a-tour-of-v8-garbage-collection –

+0

@JustinBlank Aktualisiert meine Antwort. –

+0

Kühl. Das ist eine gute Antwort. –

0

-undefined (nicht null) Einstellung funktioniert jedoch delete ist besser Beispiel delete myobj.theClass

Nur um Missverständnisse zu vermeiden Ich werde sagen, dass es keine Möglichkeit gibt, um wirklich ein Objekt aus dem Speicher in JavaScript zu löschen. Sie löschen ihre Referenzen oder setzen sie auf undefined, damit der GC seine Arbeit erledigen und wirklich löschen kann.

+0

@Karpak U die Frage nicht verstanden und nicht die Antwort, –

1

Es gibt eine Menge "es kommt darauf an", von dem, was Ihr Code tut, zu welchem ​​Browser Sie laufen. Wenn Ihr Objekt jedoch JIT kompiliert ist, um keine Karte für seine Attribute zu verwenden, dann Die Nummer sollte ein 8-Byte-Double sein, das inline innerhalb des Objekts gespeichert wird. Nulling wird nichts tun.

Die Zeichenfolge und die Myclass-Instanz wird ein Zeiger auf außerhalb des Objekts zugewiesenen Speicher sein (da eine Zeichenfolge beliebig viele Bytes sein kann, kann es nicht innerhalb des Objekts gespeichert werden. Ein Compiler könnte denkbar eine Instanz der Zeichenfolge speichern in Erinnerung und nie frei es jedoch). Durch das Nullen kann der Garbage Collector sie freigeben, bevor das Hauptobjekt den Gültigkeitsbereich verlässt.

Die eigentliche Frage ist jedoch, warum Sie sich darüber Sorgen machen. Wenn Sie Ihren Code nicht profiliert und keine Speicherbereinigung oder Speicherlecks als Problem erkannt haben, sollten Sie nicht versuchen, das GC-Verhalten zu optimieren. Vor allem, wenn Ihr Objekt lange Zeit nicht selbst aktiv ist, sollten Sie sich keine Gedanken darüber machen, Felder auf Null zu setzen. Der GC wird es sammeln, wenn es den Rahmen verlässt.

Verwandte Themen