Heim  >  Artikel  >  Web-Frontend  >  Eine kurze Analyse des JS-Garbage-Collection-Mechanismus und der Speicherverwaltung

Eine kurze Analyse des JS-Garbage-Collection-Mechanismus und der Speicherverwaltung

零到壹度
零到壹度Original
2018-04-04 14:36:241159Durchsuche

Dieser Artikel stellt hauptsächlich eine kurze Analyse des JS-Garbage-Collection-Mechanismus und der Speicherverwaltung vor. Der Herausgeber findet ihn recht gut, daher werde ich ihn jetzt mit Ihnen teilen und als Referenz verwenden. Schauen Sie sich den Editor an

Garbage Collection

Der Garbage Collection-Mechanismus in JavaScript ist sehr einfach: Finden Sie die Variablen, die nicht mehr verwendet werden, und geben Sie sie dann frei.

Lokale Variablen sind nur während der Ausführung der Funktion vorhanden. Wenn die Funktionsausführung endet, müssen lokale Variablen jedoch nicht vorhanden sein. Da jedoch nicht alle Variablen so einfach zu beurteilen sind, müssen einige Methoden verwendet werden um sie zu recyceln Variable

1 Markierung löschen:

Die am häufigsten verwendete Garbage-Collection-Methode in JavaScript besteht darin, die Markierung zu löschen Variable als „Umgebung betreten“: Wenn die Variable die Umgebung verlässt, markieren wir die Variable als „Umgebung verlassen“. Der Garbage Collector schließt die Speicherbereinigung ab.

2 Referenzzählung:

Diese Methode wird nicht so häufig verwendet. Die Bedeutung der Referenzzählung besteht darin, die Häufigkeit jedes Werts aufzuzeichnen Wenn die Anzahl der Referenzen auf 0 reduziert wird, bedeutet dies, dass es keine Möglichkeit mehr gibt, auf diesen Wert zuzugreifen, sodass der von ihm belegte Speicher freigegeben werden kann.

Es gibt jedoch ein Problem mit der Referenzzählung: Zirkelverweis. Zum Beispiel:


function problem(){
var objectA = new Object();
var objectB = new Object();
objectA.someOtherObject = objectB;
objectB.anotherObject = objectA;
}

In diesem Beispiel verweisen ObjektA und ObjektB aufeinander über ihre jeweiligen Eigenschaften, das heißt, die beiden Objekte werden referenziert mal

Die Zahlen sind alle 2. In einer Implementierung, die eine Mark-and-Sweep-Strategie verwendet, stellt dieser gegenseitige Verweis kein Problem dar, da beide Objekte nach Ausführung der Funktion den Gültigkeitsbereich verlassen. Aber in einer Implementierung, die eine Referenzzählstrategie verwendet, werden ObjektA und ObjektB nach der Ausführung der Funktion weiterhin existieren, da ihre Anzahl an Referenzen niemals 0 sein wird. Wenn diese Funktion mehrmals aufgerufen wird, wird eine große Menge an Speicher nicht recycelt

Um dieses Problem zu vermeiden, müssen wir sie auf Null setzen, wenn sie nicht zum Entfernen von Zirkelverweisen verwendet werden

Speicherverwaltung:

Wir alle wissen, dass Webbrowsern normalerweise weniger verfügbarer Speicher zugewiesen wird als Desktop-Anwendungen. Dies geschieht hauptsächlich aus Sicherheitsgründen und soll verhindern, dass eine Webseite, auf der JavaScript ausgeführt wird, den gesamten Systemspeicher belegt und zum Absturz des Systems führt. Probleme mit der Speicherbeschränkung wirken sich nicht nur auf die Speicherzuweisung für Variablen aus, sondern auch auf den Aufrufstapel und die Anzahl der Anweisungen, die gleichzeitig in einem Thread ausgeführt werden können.

Wenn Sie also sicherstellen, dass möglichst wenig Speicher belegt ist, kann die Seite eine bessere Leistung erzielen. Der beste Weg, die Speichernutzung zu optimieren, besteht darin, nur die für den ausführenden Code erforderlichen Daten zu speichern. Sobald die Daten nicht mehr nützlich sind, ist es eine gute Idee, ihre Referenz freizugeben, indem man ihren Wert auf Null setzt – eine Vorgehensweise, die Dereferenzierung genannt wird. Dieser Ansatz gilt für die meisten globalen Variablen und Eigenschaften globaler Objekte. Lokale Variablen werden automatisch dereferenziert, wenn sie die Ausführungsumgebung verlassen, wie im folgenden Beispiel gezeigt:

function createPerson(name){
var localPerson = new Object();
localPerson.name = name;
return localPerson;
}
var globalPerson = createPerson("Nicholas");
// 手工解除globalPerson 的引用
globalPerson = null;

Das Dereferenzieren eines Werts bedeutet nicht, dass der vom Wert belegte Speicher automatisch recycelt wird. Was eine Dereferenzierung tatsächlich bewirkt, ist, dass der Wert aus der Ausführungsumgebung entfernt wird, sodass er bei der nächsten Ausführung vom Garbage Collector zurückgefordert werden kann.

Verwandte Empfehlungen:

Java-Garbage-Collection-Mechanismus, Speicherverwaltung

JS-Garbage-Collection-Mechanismus und Speicherzuweisung

JavaScript-Garbage-Collection-Mechanismus und Speicherleckproblem

Das obige ist der detaillierte Inhalt vonEine kurze Analyse des JS-Garbage-Collection-Mechanismus und der Speicherverwaltung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn