Warum brauchen wir Garbage Collection (GC)?
Was ist Garbage Collection Der Garbage-Collection-Mechanismus wird auch Abfallerzeugung Wenn ein Objekt keine Variablen oder Eigenschaften hat, die darauf verweisen, können wir nie mit dem Objekt arbeiten. Dieses Objekt ist Müll. Zu viele solcher Objekte beanspruchen viel Speicherplatz und verlangsamen das Programm. Zum Beispiel: Hier habe ich zuerst eine Personenvariable deklariert, die auf das Objekt {name: "江流", age: 20} verweist. Dann habe ich diese Personenvariable auf ein anderes Objekt {name: "心猿", age: 5000} gerichtet. Das zuvor referenzierte Objekt wird nun zu einem nutzlosen Objekt und kann nie verwendet werden, um darauf zu arbeiten. Diese Art von Objekt ist Müll. Wenn zu viele Müllobjekte vorhanden sind, beanspruchen sie viel Speicherplatz. Wenn sie nicht freigegeben werden, beeinträchtigt dies die Systemleistung und kann sogar zum Absturz des Programms führen. Daher ist eine Speicherbereinigung erforderlich, um diesen Teil des Speichers freizugeben. Wir müssen und können in diesem Prozess keine Garbage Collection durchführen. Wir müssen lediglich die Objekte, die nicht mehr verwendet werden, auf Null setzen. Strategie zur Garbage CollectionDas Hauptkonzept der Speicherverwaltung in JavaScript ist die Erreichbarkeit. Dies bedeutet grob, dass Werte, auf die zugegriffen werden kann oder die auf irgendeine Weise verwendet werden können, im Speicher behalten werden müssen, während Werte, auf die nicht zugegriffen werden kann oder die nicht verwendet werden können, durch den Speicherbereinigungsmechanismus recycelt werden müssen. Der Garbage Collection-Prozess wird nicht in Echtzeit ausgeführt, da JavaScript eine Single-Thread-Sprache ist. Bei jeder Ausführung der Garbage Collection wird die Anwendungslogik des Programms angehalten. Nach Abschluss der Garbage Collection wird die Anwendungslogik erneut ausgeführt. Dieses Verhalten wird als vollständige Pause bezeichnet, sodass die Garbage Collection im Allgemeinen ausgeführt wird, wenn die CPU im Leerlauf ist. Der Schwerpunkt der Speicherbereinigung liegt auf der Suche nach sogenanntem Müll. Daher gibt es die folgenden gängigen Algorithmusstrategien. Hier sprechen wir jedoch nur über die ersten beiden:
Referenzzähler-TagsStrategisches Denken:
Zum Beispiel: sei a = { Name: "Jiang Liu", Alter: 20 }; //An dieser Stelle wird der Referenzzähler des Objekts als 1 (eine Referenz) markiert let b = a; //An diesem Punkt wird der Referenzzähler des Objekts als 2 markiert (a, b-Referenzen) a = null; //An diesem Punkt wird der Referenzzähler des Objekts als 1 markiert ((b-Referenz)) b = null; //An diesem Punkt wird der Referenzzähler des Objekts als 0 markiert (keine Variablenreferenz) ... //Warten Sie, bis GC dieses Objekt zurückfordert Dieser Ansatz hat jedoch ein ernstes Problem – zirkuläre Referenzen Durch Zirkelverweise verursachte Probleme In einer Funktion zeigt die Eigenschaft von Objekt A auf Objekt B und die Eigenschaft von Objekt B auf Objekt A. Nachdem die Funktion ausgeführt wurde, sind die Zähler der Objekte A und B nicht 0, was sich auf die normale GC auswirkt. Beispielsweise das folgende Beispiel: Funktionstest () { sei A = neues Objekt(); sei B = neues Objekt(); A.Zeiger= B; B.Zeiger = A; } prüfen(); Wenn die Eigenschaften von Objekt A und Objekt B aufeinander verweisen, beträgt ihr Referenzzähler gemäß der Referenzzählstrategie beide 2. Nachdem jedoch test () ausgeführt wurde und die Funktion ausgeführt wurde, sollten die Datenobjekte A und B im Funktionsbereich durch GC zerstört werden. Bei mehrmaliger Ausführung kommt es zu schwerwiegenden Speicherverlusten. ProblemumgehungAm Ende der Funktion setzen wir es auf null // Referenzbeziehung abschneiden A = null; B = null; Vor- und Nachteile von ReferenzzählalgorithmenVorteil:
Mangel:
Mark-and-Sweep-AlgorithmusKernidee Der Vorgang wird in zwei Phasen durchgeführt: Markieren und Räumen. Ungefährer Ablauf:
Vor- und Nachteile des Mark-Sweep-AlgorithmusVorteil:
Mangel: Nach der Garbage Collection bleiben die Speicherorte der verbleibenden Objekte unverändert, was zu diskontinuierlichem freiem Speicherplatz führt. Dies führt zu einer Speicherfragmentierung und da der verbleibende Speicherplatz kein ganzer Block ist, wird die Speicherzuweisung zum Problem. Mark-Sweep-Algorithmus Der Mark-Compact-Algorithmus kann dieses Problem effektiv lösen. Nach der Markierung verschiebt der Mark-Compact-Algorithmus die Objekte, die nicht bereinigt werden müssen, an ein Ende des Speichers und bereinigt schließlich den Speicher an der Grenze. Garbage Collection im V8-Motor
Verwenden Sie für unterschiedliche Objekte unterschiedliche Algorithmen: (1) Neue Generation: Objekte haben eine kürzere Überlebenszeit. Neue Objekte oder Objekte, für die nur einmal die Speicherbereinigung durchgeführt wurde. (2) Alte Generation: Objekte überleben länger. Ein Objekt, das einer oder mehreren Garbage Collections unterzogen wurde. Recycling von Objekten der neuen GenerationDie Objekte der neuen Generation werden hauptsächlich durch die Verwendung des Kopieralgorithmus (Scavenge-Algorithmus) und des Mark-Sweep-Algorithmus recycelt. Die spezifische Implementierung des Scavenge-Algorithmus verwendet hauptsächlich den Cheney-Algorithmus. ObjektförderungsmechanismusDie neue Generation, die eine GC-Runde überlebt, muss gefördert werden. Recycling von Gegenständen der alten GenerationDie Mark-Sweep-, Mark-Compact- und inkrementellen Mark-Algorithmen werden hauptsächlich zum Recycling von Objekten der alten Generation verwendet. Der Mark-Sweep-Algorithmus wird hauptsächlich verwendet, und der Mark-Compact-Algorithmus wird nur verwendet, wenn die Speicherzuweisung nicht ausreicht.
Referenzdokumente:JS-Speicherbereinigungsmechanismus JavaScript GC-Speicherbereinigungsmechanismus ZusammenfassenDieser Artikel endet hier. Ich hoffe, er kann Ihnen helfen. Ich hoffe auch, dass Sie mehr Inhalt auf 123WORDPRESS.COM lesen können! Das könnte Sie auch interessieren:
|
>>: Häufige Browserkompatibilitätsprobleme (Zusammenfassung)
Verwenden Sie die Vue-Cropper-Komponente, um Avat...
Inhaltsverzeichnis Vorwort Motivation für Fragmen...
„Der große Fluss fließt nach Osten, die Wellen sp...
Hinweis: Es wird empfohlen, dass der Speicher der...
Als ich kürzlich die Details der Datenlebenszyklu...
Der Test wird in der Node.JS-Umgebung bestanden. ...
SQL-Anweisung DROP-TRIGGER WENN EXISTIERT sys_men...
Wenn Ihr aktueller Pfad beispielsweise /var/log i...
Fehlermeldung: Die Store-Update-, Insert- oder De...
Redis ist eine Open-Source-NoSQL-Datenbank, die i...
Inhaltsverzeichnis 1. Parameter, die die Groß-/Kl...
Der Ogg-Prozess einer vor einiger Zeit erstellten...
Inhaltsverzeichnis Vorwort analysieren Erste Rend...
Inhaltsverzeichnis Standardausführungsprozess Opt...
Wenn man online nach Methoden sucht, um Angular -...