Beispiel für die JavaScript-Funktion „CollectGarbage“

Beispiel für die JavaScript-Funktion „CollectGarbage“

Sehen wir uns zunächst ein Beispiel für die Speicherfreigabe an:

<SCRIPT LANGUAGE="JavaScript">
<!--
strTest = "1";
für (var i = 0; i < 25; i++)
{
 strTest += strTest;
}
Alarm(strTest);
strTest löschen;
Müll sammeln();
//-->
</SCRIPT>

CollectGarbage ist eine einzigartige Eigenschaft des Internet Explorers, die zum Freigeben von Speicher verwendet wird. Die Verwendung sollte darin bestehen, die Variable oder das Referenzobjekt auf null zu setzen oder zu löschen und es dann freizugeben. Bevor CollectGarbage ausgeführt wird, müssen zwei notwendige Bedingungen erfüllt sein:

- Ein Objekt wird außerhalb des Kontextes, in dem es lebt, ungültig.
- Ein globales Objekt wird ungültig, wenn es nicht verwendet (referenziert) wird.

//---------------------------------------------------------
// Wann wird das JavaScript-Objekt ungültig//---------------------------------------------------------


Funktion testObjekt() {
var _obj1 = neues Objekt();
}

Funktion testObjekt2() {
var _obj2 = neues Objekt();
gibt _obj2 zurück;
}

// Beispiel 1
Testobjekt();

// Beispiel 2
testObjekt2()

// Beispiel 3
var obj3 = testObjekt2();
obj3 = null;

// Beispiel 4
var obj4 = testObjekt2();
var arr = [obj4];
obj3 = null;
arr = [];

In diesen vier Beispielen:

- "Beispiel 1" konstruiert _obj1 in der Funktion testObject(), aber wenn die Funktion beendet wird,
Es hat den Kontext der Funktion verlassen, daher ist _obj1 ungültig;

- In „Beispiel 2“ wird auch ein Objekt _obj2 konstruiert und in testObject2() ausgegeben, so dass das Objekt eine Kontextumgebung (und einen Lebenszyklus) „außerhalb der Funktion“ hat. Da der Rückgabewert der Funktion jedoch nicht von anderen Variablen „gehalten“ wird, wird _obj2 sofort ungültig;

– In „Beispiel 3“ wird _obj2, das von testObject2() erstellt wurde, von der externen Variable obj3 verwendet.
Zu diesem Zeitpunkt wird _obj2 ungültig, da die Referenzbeziehung verschwindet, bis die Codezeile „obj3 = null“ wirksam wird.

– Aus dem gleichen Grund wie in Beispiel 3 wird _obj2 in Beispiel 4 nach der Zeile „arr = []“ ungültig.

Allerdings bedeutet die „Ungültigkeitserklärung“ eines Objekts nicht, dass es „freigegeben“ wird. Innerhalb der JavaScript-Laufzeit gibt es keine Möglichkeit, dem Benutzer genau mitzuteilen, wann ein Objekt freigegeben wird. Dies basiert auf JavaScript
Mechanismus zur Speicherwiederverwendung. ——Diese Strategie ähnelt dem Recyclingmechanismus in .NET.

Im vorherigen Beispielcode für Excel-Operationen kann der Eigentümer des Objekts, d. h. der Prozess „EXCEL.EXE“, erst auftreten, nachdem die „ActiveX-Objektinstanz freigegeben wurde“. Die Dateisperre und die Berechtigungsnachweise des Betriebssystems beziehen sich auf den Vorgang. Wenn das Objekt also nur "ungültig" und nicht "freigegeben" ist,
Dies führt zu Problemen bei anderen Prozessen, die Dateien verarbeiten und auf die Berechtigungsnachweise des Betriebssystems verweisen.

——Manche Leute sagen, dies sei ein Fehler im JavaScript- oder COM-Mechanismus. Eigentlich ist es das nicht. Das liegt am Betriebssystem und am Internet Explorer.
Dies ist eher auf eine komplexe Beziehung zwischen Javascript und JavaScript zurückzuführen als darauf, dass es sich um ein eigenständiges Problem handelt.

Microsoft hat eine Strategie zur Lösung dieses Problems bekannt gegeben: das proaktive Aufrufen des Speicherrecyclingprozesses.

In (Microsofts) JScript wird eine CollectGarbage()-Prozedur (normalerweise als GC-Prozedur bezeichnet) bereitgestellt.
Der GC-Prozess dient zum Bereinigen der „fehlgeschlagenen Objektinstanzen“ im aktuellen IE, also zum Zerstören des aufrufenden Objekts.

Der Code zum Aufrufen des GC-Prozesses im obigen Beispiel lautet:

//---------------------------------------------------------
// Bei der Verarbeitung von ActiveX-Objekten die Standardaufrufmethode des GC-Prozesses //---------------------------------------------------------

Funktion schreibeXLS() {
//(leicht...)

excel.Beenden();
Excel = null;
setTimeout(Garbage Collect, 1);
}

Die erste Codezeile ruft die Methode excel.Quit() auf, um den Excel-Prozess zu beenden und zu verlassen.
Die Umgebung enthält die Excel-Objektinstanz, sodass der Excel-Prozess nicht tatsächlich beendet wird.

Die zweite Codezeile setzt Excel auf Null, um die Objektreferenz zu löschen, wodurch das Objekt „ungültig“ wird. Da sich das Objekt jedoch immer noch im Funktionskontext befindet, wird das Objekt trotzdem nicht bereinigt, wenn der GC-Prozess direkt aufgerufen wird.

Die dritte Codezeile verwendet setTimeout(), um die Funktion CollectGarbage aufzurufen, und das Zeitintervall wird auf „1“ gesetzt, wodurch der GC-Prozess erst nach der Ausführung der Funktion writeXLS() erfolgt. Auf diese Weise erfüllt das Excel-Objekt die Anforderung, "
Für die „GC-Bereinigung“ gibt es zwei Bedingungen: keine Referenzen und Verlassen des Kontexts.

Der Einsatz des GC-Prozesses ist in der JS-Umgebung mit ActiveX-Objekten sehr effektiv. Einige potenzielle ActiveX
Objekte umfassen XML, VML, OWC (Office Web Component), Flash und sogar VBArray in JS.
Aus dieser Sicht wird durch das aktive Aufrufen des GC-Prozesses zum richtigen Zeitpunkt eine bessere Effizienz und ein besseres UI-Erlebnis erzielt, da die Ajax-Architektur XMLHTTP verwendet und gleichzeitig die Eigenschaft „kein Seitenwechsel“ erfüllt.

Tatsächlich lässt sich das oben genannte Excel-Problem auch mit dem GC-Prozess nicht vollständig lösen. Weil der IE auch die Berechtigungsdaten zwischenspeichert. Die Anmeldeinformationen der Seite können nur durch „Wechseln zu einer neuen Seite“ aktualisiert werden.
Daher habe ich im oben erwähnten SPS-Projekt tatsächlich nicht GC als Methode verwendet, sondern den folgenden Code:

//---------------------------------------------------------
//Bei der Verarbeitung von ActiveX-Objekten verwendeter Seitenumschaltcode//---------------------------------------------------------

Funktion writeXLS() {
//(leicht...)

excel.Beenden();
Excel = null;

// Der folgende Code wird verwendet, um einen Fehler im IE-Aufruf von Excel zu beheben; die Methode wird in MSDN bereitgestellt:
// setzeTimeout(Garbage Collect, 1);
// Da der vertrauenswürdige Status der Webseite nicht gelöscht (oder synchronisiert) werden kann, sind Methoden wie SaveAs() beim nächsten Aufruf ungültig.
Standort.neu laden();
}

Der Löschoperator wird im Handbuch beschrieben

Verweise

Entfernt eine Eigenschaft aus einem Objekt oder ein Element aus einem Array.

Ausdruck löschen

Der Ausdrucksparameter ist ein gültiger JScript-Ausdruck, normalerweise ein Eigenschaftsname oder ein Array-Element.

veranschaulichen

Wenn das Ergebnis des Ausdrucks ein Objekt ist und das im Ausdruck angegebene Attribut vorhanden ist, das Objekt jedoch keine Löschung zulässt, wird „false“ zurückgegeben.

In allen anderen Fällen wird „true“ zurückgegeben.

Abschließend noch ein ergänzender Hinweis zu GC: Wenn das IE-Fenster minimiert wird, ruft der IE einmal aktiv die Funktion CollectGarbage() auf. Dadurch wird die Speichernutzung nach der Minimierung des IE-Fensters erheblich verbessert.

Dies ist das Ende dieses Artikels über den detaillierten Fall der JavaScript-Funktion CollectGarbage. Weitere relevante Inhalte zur Funktion CollectGarbage von js finden Sie in den vorherigen Artikeln von 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird!

Das könnte Sie auch interessieren:
  • Detaillierte Erklärung dieser Zeigerfunktion in JS
  • Erläuterung der JavaScript-Funktionssyntax
  • Detaillierte Erklärung zur Verwendung der Vue.js-Renderfunktion
  • JavaScript-Grundlagenreihe: Funktionen und Methoden
  • Fallstudie zu JavaScript-Funktionsaufrufen, Apply- und Bind-Methoden
  • Detaillierte Erläuterung der Einführung in die JavaScript-Funktion

<<:  Diagramm des Tutorials zur schnellen Installation und Konfiguration des Linux-Systems MySQL8.0.19

>>:  Detaillierte Schritte und Methoden zur Problemlösung zur Installation von MySQL 8.0.19 unter Linux

Artikel empfehlen

Implementieren Sie über 24 Array-Methoden in JavaScript von Hand

Inhaltsverzeichnis 1. Traversal-Klasse 1. fürJede...

Spezifische Methode zum Löschen des MySQL-Dienstes

MySQL meldet den folgenden Fehler Ich ging zu „Sy...

Detaillierte Erklärung der Destrukturierungszuweisung in JavaScript

Inhaltsverzeichnis Konzept Array-Destrukturierung...

So implementieren Sie eine MySQL-Master-Slave-Replikation basierend auf Docker

Vorwort Die MySQL Master-Slave-Replikation ist di...

Grundlegende Anwendungsbeispiele für Listener in Vue

Inhaltsverzeichnis Vorwort 1. Grundlegende Verwen...

Der Unterschied und die Wahl zwischen Datum und Uhrzeit und Zeitstempel in MySQL

Inhaltsverzeichnis 1 Unterschied 1.1 Raumbelegung...

JavaScript zur Implementierung eines einziehbaren sekundären Menüs

Der spezifische Code zur Implementierung des einz...

Ändern Sie die Startzeit von Grub in Ubuntu

Die Online-Suche zum Ändern der Grub-Startzeit be...

3 verschiedene Möglichkeiten zum Löschen der Optionsoptionen im Auswahltag

Methode 1 Code kopieren Der Code lautet wie folgt:...

Der Kernprozess der NodeJS-Verarbeitung einer TCP-Verbindung

Vor ein paar Tagen habe ich mit einem Freund etwa...

So betten Sie mithilfe von Iframe andere Webseiten in eine Webseite ein

So verwenden Sie Iframe: Code kopieren Der Code l...

JavaScript ist unzuverlässig undefiniert

undefined Wenn wir in JavaScript feststellen möch...

Lösung zur Bereinigung des Docker-Festplattenspeichers

Vor einiger Zeit stieß ich auf das Problem, dass ...