1. Müllrecyclingmechanismus - GC
JavaScript verfügt über einen automatischen Mülleimermechanismus (GC: Garbage Collection), was bedeutet, dass die Ausführungsumgebung für die Verwaltung des während der Codeausführung verwendeten Speichers verantwortlich ist.
Prinzip: Der Müllsammler regelmäßig (regelmäßig) findet Variablen, die nicht benutzt werden, und befreit dann ihr Gedächtnis.
Der Mechanismus der JavaScript -Müllsammlung ist sehr einfach: Finden Sie Variablen heraus, die nicht mehr verwendet werden, und befreien Sie dann den Speicher, den sie besetzt. Dieser Prozess ist jedoch keine Echtzeit, da sein Overhead relativ groß ist, sodass der Müllsammler in festen Zeitintervallen regelmäßig ausgeführt wird.
Variablen, die nicht mehr verwendet werden, sind Variablen, die den Lebenszyklus beenden. Natürlich können sie nur lokale Variablen sein. Der Lebenszyklus der globalen Variablen endet erst, wenn der Browser die Seite deinstalliert. Lokale Variablen existieren nur während der Ausführung der Funktion, und in diesem Prozess wird der entsprechende Raum für lokale Variablen auf dem Stapel oder Haufen zugewiesen, um ihre Werte zu speichern, und dann werden diese Variablen in der Funktion bis zum Ende der Funktion verwendet. Aufgrund interner Funktionen im Verschluss können externe Funktionen jedoch nicht als endgültig eingestuft werden.
Erklären wir einfach den Code:
Funktion fn1 () {var obj = {name: 'hanzichi', Alter: 10};} Funktion fn2 () {var obj = {name: 'hanzichi', Alter: 10}; return obj;} var a = fn1 (); var b = fn2 ();Mal sehen, wie der Code ausgeführt wird. Zunächst werden zwei Funktionen definiert, genannt FN1 und FN2. Wenn FN1 aufgerufen wird, öffnet die Eingabe der FN1 -Umgebung ein Speicherspeicherobjekt {Name: 'Hanzichi', Alter: 10}. Wenn der Anruf abgeschlossen ist und die FN1 -Umgebung nicht mehr ist, wird der Speicherblock vom Müllsammler im JS -Motor automatisch freigegeben. Während des aufgerufenen FN2 -Prozesses wird das zurückgegebene Objekt durch die globale Variable B darauf hingewiesen, sodass der Speicherblock nicht freigegeben wird.
Hier stellt sich die Frage: Welche Variable ist nutzlos? Daher muss der Müllsammler verfolgen, welche Variable nutzlos ist, und markieren Variablen, die nicht mehr nützlich sind, um sein Gedächtnis in Zukunft zurückzugewinnen. Die Strategien für nutzlose Variablen, die zum Tag -Tag verwendet werden, können sich je nach Implementierung unterscheiden, und es gibt normalerweise zwei Möglichkeiten, dies zu tun: Markierung und Referenzzählung. Die Zitatzählung ist nicht sehr häufig, Markierung wird häufiger verwendet.
2. Clear Mark
Die am häufigsten verwendete Müllsammlungsmethode in JS ist die Markierungsentfernung. Wenn beispielsweise eine Variable in die Umgebung eingeht, deklariert sie beispielsweise eine Variable in einer Funktion, sie markiert die Variable als "die Umgebung eingeben". Logischerweise kann der Speicher, der von Variablen besetzt ist, die in die Umgebung eintreten, nicht freigegeben werden, da sie verwendet werden können, solange der Ausführungsfluss in die entsprechende Umgebung eintritt. Und wenn eine Variable die Umgebung verlässt, ist sie als "aus der Umgebung" gekennzeichnet.
Funktion test () {var a = 10; // wird markiert, geben Sie die Umgebung ein. var b = 20; // wird gekennzeichnet, die Umgebung eingeben} test (); // Nach Ausführung sind A und B markiert, verlassen die Umgebung und werden recycelt.Wenn der Müllsammler ausgeführt wird, markiert er alle im Speicher gespeicherten Variablen (natürlich kann jede Markierungsmethode verwendet werden). Anschließend werden die Tags (Verschlüsse) von Variablen in der Umgebung und Variablen entfernt, auf die sich Variablen in der Umgebung beziehen. Die danach gekennzeichneten Variablen werden als Variablen betrachtet, die zum Löschen bereit sind, da Variablen in der Umgebung nicht mehr auf diese Variablen zugreifen können. Schließlich vervollständigt der Garbage Collector die Memory -Clearing -Arbeit, zerstört die markierten Werte und rebiert den Speicherplatz zurück, den sie besetzen.
Bisher unterscheiden sich die JS-Implementierungen von IE, Firefox, Opera, Chrome und Safari mit Markierungsansammlungsstrategien oder ähnlichen Strategien, aber die Zeitintervalle der Müllsammlung unterscheiden sich voneinander.
3. Zitatzahl
Die Bedeutung der Referenzzahl besteht darin, die Häufigkeit zu verfolgen, wie oft jeder Wert verwiesen wird. Wenn eine Variable deklariert und der Variablen ein Referenztypwert zugewiesen wird, beträgt die Anzahl der Verweise auf diesen Wert 1. Wenn der gleiche Wert einer anderen Variablen zugewiesen wird, wird die Anzahl der Verweise auf den Wert um 1 erhöht. Im Gegenteil, im Gegenteil, wenn die Variable enthält, die den Hinweis auf den Wert auf einen anderen Wert nimmt, wird dies. Es kann zurückgefordert werden. Auf diese Weise, wenn der Garbage Collector beim nächsten Mal wieder läuft, wird der Speicher, der mit 0 Referenzen schätzt, frei.
Funktion test () {var a = {}; // Die Anzahl der Referenzen von A beträgt 0 var b = a; // Die Anzahl der Referenzen von a ist 1 var c = a; // Die Anzahl der Referenzen von A beträgt 1, und die Anzahl der Referenzen von A beträgt 1, und die Anzahl der Referenzen von A beträgt 1, und die Anzahl der Referenzen von A beträgt 2 var b = {}; // Die Anzahl der Referenzen von A beträgt 1 und die Anzahl der Referenzen von A beträgt 1}Netscape Navigator3 war der erste Browser, der die Referenzzählstrategie verwendete, aber bald traf sie ein ernstes Problem: Rundschreiben. Eine kreisförmige Referenz bezieht sich auf ein Objekt A, das einen Zeiger auf Objekt B enthält, und Objekt B enthält auch einen Verweis auf Objekt A.
Funktion fn () {var a = {}; var b = {}; A.Pro = b; B.Pro = a;} fn ();Die Referenzzeiten von A und B oben sind 2., nachdem FN () ausgeführt wurde, haben beide Objekte die Umgebung verlassen. Es gibt kein Problem im Mark -Clearing -Modus. Unter der Referenzzählstrategie, da die Referenzzeiten von A und B nicht 0 sind, wird der Speicher nicht vom Müllsammler gesammelt. Wenn die FN -Funktion in großen Mengen aufgerufen wird, tritt Speicherleckage auf. Auf IE7 und IE8 steigt die Erinnerung stark an.
Wir wissen, dass einige Objekte in IE keine nativen JS -Objekte sind. Beispielsweise werden die Objekte in DOM und BOM in Form von COM -Objekten unter Verwendung von C ++ implementiert, und der Müllsammlungsmechanismus von COM -Objekten verwendet eine Referenzzählstrategie. Selbst wenn die IE JS -Engine eine Tag -Clearing -Strategie anwendet, basieren die von JS aufgerufenen COM -Objekte immer noch auf der Referenzzählstrategie. Mit anderen Worten, solange COM -Objekte an IE beteiligt sind, wird es ein Problem von kreisförmigen Referenzen geben.
var element = document.getElementById ("selten_element"); var myObject = new Object (); myObject.e = element.o = myObject;In diesem Beispiel wird eine kreisförmige Referenz zwischen einem DOM -Element und einem nativen JS -Objekt erstellt. Unter ihnen hat das Variable MyObject ein Attribut mit dem Namen Element, das auf das Elementobjekt zeigt; und das variable Element hat auch ein Attribut mit dem Namen O zurück, um sich auf MyObject zu beziehen. Aufgrund dieser kreisförmigen Referenz wird das DOM im Beispiel von der Seite nie recycelt.
An betrachteten Beispielen fanden einige Schüler es zu schwach. Wer würde so ein langweiliges Ding machen? Tatsächlich tun wir das?
window.onload = function oterfunction () {var obj = document.getElementById ("Element"); obj.onclick = function InnerFunction () {};};Dieser Code scheint in Ordnung zu sein, aber OBJ bezieht sich auf document.getElementById ("Element"), und die Onclick -Methode von document.getElementById ("Element") bezieht sich auf die deutsche Variable in der externen Umgebung, die natürlich auch OBJ enthält. Ist es nicht sehr versteckt?
Lösung
Der einfachste Weg ist es, die Schleife manuell zu beseitigen, beispielsweise kann die Funktion dies gerade jetzt tun.
myObject.element = null; element.o = null;
window.onload = function oterfunction () {var obj = document.getElementById ("Element"); obj.onclick = function InnerFunction () {}; obj = null;};Das Einstellen einer Variablen in Null bedeutet, die Verbindung zwischen der Variablen und dem zuvor verwiesenen Wert abzuschneiden. Wenn der Müllsammler das nächste Mal läuft, werden diese Werte gelöscht und der von ihnen belegte Speicher wird recycelt.
Es ist zu beachten, dass IE9+ keine kreisförmige Referenz hat, um DOM -Speicherlecks zu verursachen. Es kann sein, dass Microsoft es optimiert hat oder die Recyclingmethode von DOM geändert hat.
4. Speicherverwaltung
1. Wann wird die Müllsammlung ausgelöst?
Der Müllsammler läuft regelmäßig. Wenn der zugewiesene Gedächtnis sehr groß ist, wird die Recyclingarbeit sehr schwierig. Das Bestimmen des Zeitintervalls der Müllsammlung wird zu einer Frage, über die es sich lohnt, darüber nachzudenken. Die Müllsammlung von IE6 läuft nach der Speicherzuweisung. Wenn es 256 Variablen, 4096 Objekte und 64K in der Umgebung gibt, wird der Müllsammler ausgelöst. Es sieht sehr wissenschaftlich aus und muss für eine Weile nicht einmal aufgerufen werden. Manchmal ist es unnötig. Ist es nicht gut, nach Bedarf so zu rufen? Aber wenn es so viele Variablen in der Umgebung gibt und die Skripte jetzt so komplex und normal sind, dann ist das Ergebnis, dass der Müllsammler immer funktioniert, sodass der Browser nicht spielen kann.
Microsoft hat Anpassungen in IE7 vorgenommen. Die Triggerbedingungen werden nicht mehr fixiert, sondern dynamisch geändert. Der Anfangswert ist der gleiche wie IE6. Wenn die vom Müllkollektor gesammelte Speicherzuweisung weniger als 15% des vom Programms besetzten Speichers beträgt, bedeutet dies, dass der größte Teil des Speichers nicht recycelt werden kann. Die Auslöser der Set Müllsammlung sind zu empfindlich. Zu diesem Zeitpunkt doppelt die Straßenbedingungen. Wenn der gesammelte Speicher höher als 85%ist, bedeutet dies, dass der größte Teil des Speichers vor langer Zeit gereinigt werden sollte. Zu diesem Zeitpunkt sind die Triggerbedingungen zurückgesetzt. Dadurch funktioniert der Müllrecycling mehr Funktionen
2. Angemessene GC -Lösung
1) Die grundlegende GC -Lösung der JavaScript -Engine ist (einfacher GC): Mark und Sweep, d. H.:
2) GC -Defekte
Wie bei anderen Sprachen kann die GC -Richtlinie von JavaScript kein Problem vermeiden: Wenn GC auf andere Operationen reagiert, dh aus Sicherheitsgründen. JavaScripts GC ist 100 ms oder sogar oben, was für allgemeine Anwendungen gut ist, aber für JS -Spiele sind Anwendungen, die eine hohe Kohärenz erfordern, problematisch. Dies ist, was der neue Motor optimieren muss: Vermeiden Sie eine durch GC verursachte langfristige Anhaltensantwort.
3) GC -Optimierungsstrategie
Onkel David führte hauptsächlich zwei Optimierungslösungen ein, und dies sind auch die wichtigsten Optimierungslösungen:
(1) Generation GC)
Dies steht im Einklang mit der Idee der Java -Recyclingstrategie. Ziel ist es, zwischen "vorübergehenden" und "anhaltenden" Objekten zu unterscheiden. Recyceln mehr "temporäre Objekte" und weniger "angesehene Objekte", reduzieren Sie die Objekte, die jedes Mal durchquert werden müssen, wodurch die Zeit, die für GCs aufgewendet wurde, jedes Mal reduziert werden. Wie im Bild gezeigt:
Hier muss hinzugefügt werden, dass für das Objekt der festen Generation einen zusätzlichen Overhead vorhanden ist: Migrieren Sie es von der jungen Generation bis zur festen Generation, und wenn es verwiesen wird, muss auch die Referenz angezeigt werden.
(2) Inkrementelle GC
Die Idee dieses Plans ist sehr einfach, "ein wenig jedes Mal ein wenig zu behandeln, beim nächsten Mal ein wenig umzugehen und so weiter". Wie im Bild gezeigt:
Obwohl diese Lösung eine kurze Zeit in Anspruch nimmt, hat sie viele Unterbrechungen, was das Problem des häufigen Kontextschalters darstellt.
Da jede Lösung ihre anwendbaren Szenarien und Nachteile hat, wird die Lösung in tatsächlichen Anwendungen gemäß der tatsächlichen Situation ausgewählt.
Zum Beispiel: Wenn das Verhältnis von (Objekt/S) niedrig ist, wird die Frequenz der Ausführung von GC unterbrochen und der einfache GC niedriger; Wenn eine große Anzahl von Objekten für lange Zeit "überlebt" wird, ist der Vorteil der Generationsverarbeitung nicht großartig.
Der obige Artikel versteht, dass Javascirps Müllsammlungs -Recycling -Mechanismus von Javascirp ist, der alles inhalt ist, den ich mit Ihnen teile. Ich hoffe, es kann Ihnen eine Referenz geben und ich hoffe, Sie können Wulin.com mehr unterstützen.