Was ist JavaScript Garbage Collection?

Lesezeit: 9 Minuten

Was ist JavaScript Garbage Collection? Was ist für einen Webprogrammierer wichtig, um die JavaScript-Garbage-Collection zu verstehen, um besseren Code schreiben zu können?

  • siehe auch stackoverflow.com/questions/774357/garbage-collection

    – Ian Ringrose

    26. September 2010 um 16:00 Uhr

  • Siehe auch Wie funktioniert Javascript Garbage Collection?

    – Bergi

    27. März 2015 um 10:40 Uhr

Was ist JavaScript Garbage Collection
Noldorin

Eric Lippert schrieb a ausführlicher Blogbeitrag zu diesem Thema vor einiger Zeit (zusätzlich zum Vergleich mit VBScript). Genauer gesagt, er schrieb über JScript, die Microsofts eigene Implementierung von ECMAScript ist, obwohl sie JavaScript sehr ähnlich ist. Ich könnte mir vorstellen, dass Sie davon ausgehen können, dass die überwiegende Mehrheit des Verhaltens für die JavaScript-Engine von Internet Explorer gleich ist. Natürlich variiert die Implementierung von Browser zu Browser, obwohl ich vermute, dass Sie eine Reihe der allgemeinen Prinzipien nehmen und sie auf andere Browser anwenden könnten.

Zitat von dieser Seite:

JScript verwendet einen Mark-and-Sweep-Garbage-Collector ohne Generationen. Es funktioniert so:

  • Jede Variable, die sich “im Geltungsbereich” befindet, wird als “Scavenger” bezeichnet. Ein Scavenger kann sich auf eine Zahl, ein Objekt, eine Zeichenfolge oder was auch immer beziehen. Wir pflegen eine Liste von Scavengern – Variablen werden in die Scav-Liste verschoben, wenn sie in den Geltungsbereich kommen, und aus der Scav-Liste, wenn sie den Geltungsbereich verlassen.

  • Hin und wieder läuft der Garbage Collector. Zuerst setzt es eine “Markierung” auf jedes Objekt, jede Variable, jeden String usw. – den gesamten Speicher, der vom GC verfolgt wird. (JScript verwendet intern die VARIANT-Datenstruktur und es gibt viele zusätzliche ungenutzte Bits in dieser Struktur, also setzen wir nur eines davon.)

  • Zweitens löscht es die Markierung auf den Scavengern und den transitiven Abschluss von Scavenger-Referenzen. Wenn also ein Scavenger-Objekt auf ein Nicht-Scavenger-Objekt verweist, löschen wir die Bits auf dem Nicht-Scavenger und auf allem, worauf es sich bezieht. (Ich verwende das Wort “Schließung” in einem anderen Sinne als in meinem früheren Beitrag.)

  • An diesem Punkt wissen wir, dass der gesamte noch markierte Speicher zugewiesener Speicher ist, der von keinem Pfad aus einer Variablen innerhalb des Gültigkeitsbereichs erreicht werden kann. Alle diese Objekte werden angewiesen, sich selbst abzureißen, wodurch alle Zirkelbezüge zerstört werden.

Der Hauptzweck der Garbage Collection besteht darin, dem Programmierer dies zu ermöglichen nicht sich um die Speicherverwaltung der von ihnen erstellten und verwendeten Objekte zu kümmern, obwohl es natürlich manchmal nicht zu vermeiden ist – es ist immer von Vorteil, zumindest eine ungefähre Vorstellung davon zu haben, wie die Garbage Collection funktioniert.

Historischer Hinweis: Eine frühere Überarbeitung der Antwort hatte einen falschen Verweis auf die delete Operator. Im JavaScript der delete Operator entfernt eine Eigenschaft von einem Objektund ist ganz anders als delete in C/C++.

  • Der Apple-Leitfaden ist fehlerhaft: Der Autor verwendet delete falsch; zB im ersten Beispiel statt delete foosollten Sie zuerst den Ereignis-Listener über entfernen window.removeEventListener() und dann verwenden foo = null um die Variable zu überschreiben; im IE, delete window.foo (aber nicht delete foo) hätte auch funktioniert, wenn foo war global, aber selbst dann nicht in FF oder Opera

    – Christoph

    18. Januar 2010 um 13:21 Uhr


  • Beachten Sie, dass der Artikel von Eric “nur für historische Zwecke” betrachtet werden sollte. Aber informativ ist es trotzdem.

    – Peter Iwan

    17. September 2012 um 14:23 Uhr

  • Beachten Sie auch – IE 6 und 7 verwenden KEINEN Mark-and-Sweep-Garbage-Collector ohne Generation. Sie verwenden einen einfachen Garbage Collector mit Verweiszählung, der anfälliger für Probleme mit zirkulären Verweisen bei der Garbage Collection ist.

    – Doug

    5. Februar 2013 um 21:11 Uhr

  • ECMAScripts delete ist ein unärer Operator (ein Ausdruck), keine Anweisung (dh: delete 0, delete 0, delete 3). Es sieht wie eine Anweisung aus, wenn es durch eine Ausdrucksanweisung ausgedrückt wird.

    – Klaider

    11. Mai 2017 um 23:44 Uhr


  • Ja, die damalige Antwort ist jetzt veraltet, ab 2012 verwenden moderne Browser einen Mark/Sweep-Algorithmus, sodass sie nicht mehr vom Bereich abhängig sind. Referenzierung: developer.mozilla.org/en-US/docs/Web/JavaScript/…

    – sksallaj

    3. März 2018 um 0:51 Uhr

1646630717 513 Was ist JavaScript Garbage Collection
Christoph

Achten Sie auf Zirkelverweise, wenn es sich um DOM-Objekte handelt:

Speicherleckmuster in JavaScript

Denken Sie daran, dass Speicher nur zurückgefordert werden kann, wenn keine aktiven Verweise auf das Objekt vorhanden sind. Dies ist eine häufige Falle bei Closures und Event-Handlern, da einige JS-Engines nicht prüfen, auf welche Variablen tatsächlich in inneren Funktionen verwiesen wird, und einfach alle lokalen Variablen der einschließenden Funktionen behalten.

Hier ist ein einfaches Beispiel:

function init() {
    var bigString = new Array(1000).join('xxx');
    var foo = document.getElementById('foo');
    foo.onclick = function() {
        // this might create a closure over `bigString`,
        // even if `bigString` isn't referenced anywhere!
    };
}

Eine naive JS-Implementierung kann nicht sammeln bigString solange der Event-Handler in der Nähe ist. Es gibt mehrere Möglichkeiten, dieses Problem zu lösen, zB Einstellung bigString = null am Ende von init() (delete funktioniert nicht für lokale Variablen und Funktionsargumente: delete entfernt Eigenschaften von Objekten, und auf das variable Objekt kann nicht zugegriffen werden – ES5 im strikten Modus wirft sogar eine ReferenceError wenn Sie versuchen, eine lokale Variable zu löschen!).

Ich empfehle, unnötige Schließungen so weit wie möglich zu vermeiden, wenn Sie Wert auf Speicherverbrauch legen.

  • Der DOM Circular Reference Bug ist spezifisch für JScript – kein anderer Browser außer IE leidet darunter. Tatsächlich bin ich mir ziemlich sicher, dass die ECMAScript-Spezifikation ausdrücklich besagt, dass der GC in der Lage sein muss, mit solchen Zyklen umzugehen :-/

    – Oliej

    14. Mai 2009 um 20:11 Uhr

  • @olliej: Ich sehe keine Erwähnung des GC in der ECMAScript-Spezifikation.

    – Janus Troelsen

    31. Mai 2013 um 9:06 Uhr

  • siehe auch point.davidglasser.net/2013/06/27/…

    – Christoph

    29. Juni 2013 um 13:43 Uhr

Was ist JavaScript Garbage Collection
TStampfer

Gutes Zitat aus einem Blog

Die DOM-Komponente wird wie die JScript-Komponente „garbage-collectiert“, was bedeutet, dass wenn Sie ein Objekt innerhalb einer der beiden Komponenten erstellen und dann den Überblick über dieses Objekt verlieren, es schließlich bereinigt wird.

Zum Beispiel:

function makeABigObject() {
var bigArray = new Array(20000);
}

Wenn Sie diese Funktion aufrufen, erstellt die JScript-Komponente ein Objekt (mit dem Namen bigArray), auf das innerhalb der Funktion zugegriffen werden kann. Sobald die Funktion jedoch zurückkehrt, “verlieren” Sie den Überblick über bigArray, weil es keine Möglichkeit mehr gibt, darauf zu verweisen. Nun, die JScript-Komponente erkennt, dass Sie den Überblick verloren haben, und so wird bigArray bereinigt – sein Speicher wird zurückgefordert. Dasselbe funktioniert in der DOM-Komponente. Wenn du sagst document.createElement('div'), oder etwas Ähnliches, dann erstellt die DOM-Komponente ein Objekt für Sie. Sobald Sie dieses Objekt irgendwie aus den Augen verloren haben, bereinigt die DOM-Komponente das zugehörige Objekt.

1646630718 192 Was ist JavaScript Garbage Collection
Hitze Geizhals

Nach meinem besten Wissen werden JavaScript-Objekte regelmäßig von der Garbage Collection erfasst, wenn keine Verweise mehr auf das Objekt vorhanden sind. Es geschieht automatisch, aber wenn Sie mehr darüber erfahren möchten, wie es auf C++-Ebene funktioniert, ist es sinnvoll, einen Blick auf die zu werfen WebKit oder V8-Quellcode

In der Regel brauchen Sie sich darüber keine Gedanken zu machen, aber in älteren Browsern wie IE 5.5 und frühen Versionen von IE 6 und vielleicht aktuellen Versionen würden Closures Zirkelverweise erzeugen, die, wenn sie nicht aktiviert würden, am Ende Speicherplatz verbrauchen würden. In dem speziellen Fall, den ich mit Closures meine, war es, als Sie einem Dom-Objekt eine JavaScript-Referenz und einem DOM-Objekt ein Objekt hinzugefügt haben, das auf das JavaScript-Objekt zurückverwies. Grundsätzlich könnte es niemals gesammelt werden und würde schließlich dazu führen, dass das Betriebssystem in Test-Apps instabil wird, die in Schleifen zu Abstürzen führen. In der Praxis sind diese Lecks normalerweise klein, aber um Ihren Code sauber zu halten, sollten Sie den JavaScript-Verweis auf das DOM-Objekt löschen.

Normalerweise ist es eine gute Idee, das Schlüsselwort delete zu verwenden, um große Objekte wie JSON-Daten, die Sie zurückerhalten haben, sofort zu dereferenzieren und alles zu tun, was Sie damit tun müssen, insbesondere bei der Entwicklung mobiler Webs. Dies bewirkt, dass der nächste Sweep des GC dieses Objekt entfernt und seinen Speicher freigibt.

Garbage Collection (GC) ist eine Form der automatischen Speicherverwaltung, indem nicht mehr benötigte Objekte entfernt werden.

Befolgen Sie bei jedem Prozess, der sich mit dem Speicher befasst, die folgenden Schritte:

1 – Weisen Sie Ihren Speicherplatz zu, den Sie benötigen

2 – etwas verarbeiten

3 – diesen Speicherplatz freigeben

Es gibt zwei Hauptalgorithmen, die verwendet werden, um zu erkennen, welche Objekte nicht mehr benötigt werden.

Garbage Collection mit Referenzzählung: Dieser Algorithmus reduziert die Definition von “ein Objekt wird nicht mehr benötigt” auf “ein Objekt hat kein anderes Objekt, das darauf verweist”, das Objekt wird entfernt, wenn kein Referenzpunkt darauf verweist

Mark-and-Sweep-Algorithmus: Verbinden Sie jedes Objekt mit der Root-Quelle. Kein Objekt stellt eine Verbindung zum Stamm oder einem anderen Objekt her. Dieses Objekt wird entfernt.

derzeit die meisten modernen Browser, die den zweiten Algorithmus verwenden.

1646630719 927 Was ist JavaScript Garbage Collection
mtasic85

„In der Informatik ist die Garbage Collection (GC) eine Form der automatischen Speicherverwaltung. Der Garbage Collector oder einfach nur Collector versucht, Garbage oder Speicher zurückzugewinnen, der von Objekten verwendet wird, auf die die Anwendung nie wieder zugreift oder die erneut mutiert werden.“

Alle JavaScript-Engines haben ihre eigenen Garbage Collectors, und sie können sich unterscheiden. Meistens müssen Sie sich nicht mit ihnen auseinandersetzen, weil sie einfach tun, was sie tun sollen.

Das Schreiben von besserem Code hängt hauptsächlich davon ab, wie gut Sie Programmierprinzipien, Sprache und bestimmte Implementierungen kennen.

Referenztypen Speichern Sie das Objekt nicht direkt in der Variablen, der es zugewiesen ist, sodass die Objektvariable im Beispiel unten nicht wirklich die Objektinstanz enthält. Stattdessen enthält es einen Zeiger (oder eine Referenz) auf den Speicherort, an dem das Objekt vorhanden ist.

var object = new Object();

Wenn Sie eine referenztypisierte Variable einer anderen zuweisen, erhält jede Variable eine Kopie des Zeigers, und beide referenzieren immer noch auf dasselbe Objekt im Speicher.

var object1 = new Object();
var object2 = object1;

Zwei Variablen, die auf ein Objekt zeigen

JavaScript ist ein Müll gesammelt Sprache, sodass Sie sich bei der Verwendung von Referenztypen keine Gedanken über Speicherzuweisungen machen müssen. Am besten jedoch Dereferenzierung Objekte, die Sie nicht mehr benötigen, damit der Garbage Collector diesen Speicher freigeben kann. Der beste Weg, dies zu tun, besteht darin, die Objektvariable auf null zu setzen.

var object1 = new Object();
// do something
object1 = null; // dereference

Dereferenzierung Objekte ist besonders wichtig in sehr großen Anwendungen, die Millionen von Objekten verwenden.

aus Die Prinzipien des objektorientierten JavaScripts – NICHOLAS C. ZAKAS

963140cookie-checkWas ist JavaScript Garbage Collection?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy