Heim Web-Frontend js-Tutorial Eine ausführliche Diskussion über JavaScript-Speicherlecks_Javascript-Fähigkeiten

Eine ausführliche Diskussion über JavaScript-Speicherlecks_Javascript-Fähigkeiten

May 16, 2016 pm 04:31 PM
javascript 内存泄漏

1. Was ein Abschluss ist und welche Umfangskette an dem Abschluss beteiligt ist, wird hier nicht besprochen.

2. JavaScript-Garbage-Collection-Mechanismus

JavaScript muss den Speicher nicht manuell freigeben, sondern verwendet einen automatischen Garbage-Collection-Mechanismus (Garbage Collection). Wenn ein Objekt nutzlos ist, das heißt, wenn keine Variable im Programm auf das Objekt verweist, wird die Variable aus dem Speicher freigegeben.

Code kopieren Der Code lautet wie folgt:

var s = [1, 2,3];
var s = null;
//Auf diese Weise wird das ursprüngliche Array [1,2,3] freigegeben.

3. Zirkelverweis

Drei Objekte A, B, C

AàBàC: Ein bestimmtes Attribut von A verweist auf B, und C wird auch durch ein Attribut von B referenziert. Wenn A gelöscht wird, werden auch B und C freigegeben.

AàBàCàB: Hier wird ein bestimmtes Attribut von C hinzugefügt, um auf das B-Objekt zu verweisen. Wenn dies A löschen soll, werden B und C nicht freigegeben, da ein Zirkelverweis zwischen B und C erzeugt wird.

Code kopieren Der Code lautet wie folgt:

var a = {};
a.pro = { a:100 };
a.pro.pro = { b:100 };
a = null ;
//In diesem Fall werden auch {a:100} und {b:100} gleichzeitig freigegeben.
                                                                  var obj = {};
Obj.pro = { a : 100 };
Obj.pro.pro = { b : 200 };
var two = obj.pro.pro;
Obj = null;
//In diesem Fall wird {b:200} nicht freigegeben, aber {a:100} wird freigegeben.

4. Zirkelverweise und Abschlüsse

Code kopieren Der Code lautet wie folgt:
Funktion äußere(){
var obj = {};
Funktion inner(){
//Das obj-Objekt wird hier referenziert
}
         obj.inner = inner;
}

Dies ist ein äußerst versteckter Zirkelverweis. Wenn „outer“ einmal aufgerufen wird, werden darin zwei Objekte erstellt, „obj“ und „inner“. Um genau zu sein, das liegt an der einzigartigen „Bereichskette“ von JavaScript.

Daher ist es für Abschlüsse sehr einfach, Zirkelverweise zu erstellen. Glücklicherweise kann JavaScript solche Zirkelverweise sehr gut verarbeiten.

5. Speicherverlust im IE

Es gibt verschiedene Arten von Speicherlecks im IE, ausführliche Erklärungen finden Sie hier (

http://msdn.microsoft.com/en-us/library/bb250448.aspx).

Hier wird nur einer davon besprochen, nämlich der durch Zirkelverweise verursachte Speicherverlust, da dies die häufigste Situation ist.

Wenn es einen Zirkelverweis zwischen einem DOM-Element oder einem ActiveX-Objekt und einem normalen JavaScript-Objekt gibt, hat der IE besondere Schwierigkeiten, solche Variablen freizugeben. Dieser Fehler wurde im IE behoben 7 (

http://www.quirksmode.org/blog/archives/2006/04/ie_7_and_javasc.html).

„IE 6 litt unter Speicherlecks, als ein Zirkelverweis zwischen mehreren Objekten, darunter mindestens einem DOM-Knoten, erstellt wurde. Dieses Problem wurde in IE 7 gelöst.“

Wenn sich obj im obigen Beispiel (Punkt 4) nicht auf ein JavaScript-Funktionsobjekt (inner), sondern auf ein ActiveX-Objekt oder Dom-Element bezieht, kann der im IE gebildete Zirkelverweis nicht freigegeben werden.

Code kopieren Der Code lautet wie folgt:

Funktion init(){
        var elem = document.getElementByid( 'id' );
          elem.onclick = function(){
alarm('rain-man');
//Das Elem-Element
wird hier referenziert         };
}

Elem bezieht sich auf seine Click-Event-Listening-Funktion, die über ihre Scope-Kette auch auf das Elem-Element verweist. Auf diese Weise werden diese Zirkelverweise auch dann nicht freigegeben, wenn Sie die aktuelle Seite im IE verlassen.

6. Lösung

Die grundlegende Methode besteht darin, diesen Zirkelverweis manuell zu löschen. In einer tatsächlichen Anwendung können Sie selbst eine addEvent()-Funktion erstellen und alle Ereignisbindungen für das Entladeereignis des Fensters löschen.

Code kopieren Der Code lautet wie folgt:

Funktion äußere(){
         var one = document.getElementById( 'one' );
         one.onclick = function(){};
}
​ window.onunload = function(){
         var one = document.getElementById( 'one' );
         one.onclick = null;
};

Andere Methoden (von: Douglas Crockford)

Code kopieren Der Code lautet wie folgt:

/**
* Durchlaufen Sie einen Elementknoten und alle seine untergeordneten Elemente
*
* @param Elem node Der zu löschende Elementknoten
* @param function func Die Funktion zur Verarbeitung von
*
​*/
Funktion walkTheDOM(node, func) {
func(node);
node = node.firstChild;
while (Knoten) {
         walkTheDOM(node, func);
Node = node.nextSibling; }
}
/**
* Löschen Sie alle Verweise auf Dom-Knoten, um Speicherlecks zu verhindern
*
* @param Elem node Der zu löschende Elementknoten
*
​*/
Funktion purgeEventHandlers(node) {
walkTheDOM(node, function (e) {
for (var n in e) {                                   If (typeof e[n] ===
                      'Funktion') {
                 e[n] = null;
            }
}
});


Das Obige ist der relevante Inhalt und die Lösungen für JavaScript-Speicherlecks. Freunde in Not können darauf verweisen
Erklärung dieser Website
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

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Go-Speicherleckverfolgung: Go pprof-Praxisleitfaden Go-Speicherleckverfolgung: Go pprof-Praxisleitfaden Apr 08, 2024 am 10:57 AM

Mit dem pprof-Tool kann die Speichernutzung von Go-Anwendungen analysiert und Speicherlecks erkannt werden. Es bietet die Erstellung von Speicherprofilen, die Identifizierung von Speicherlecks und Funktionen zur Echtzeitanalyse. Erstellen Sie mit pprof.Parse einen Speicher-Snapshot und identifizieren Sie die Datenstrukturen mit den meisten Speicherzuweisungen mithilfe des Befehls pprof-allocspace. Gleichzeitig unterstützt pprof Echtzeitanalysen und stellt Endpunkte für den Fernzugriff auf Informationen zur Speichernutzung bereit.

Einfaches JavaScript-Tutorial: So erhalten Sie den HTTP-Statuscode Einfaches JavaScript-Tutorial: So erhalten Sie den HTTP-Statuscode Jan 05, 2024 pm 06:08 PM

JavaScript-Tutorial: So erhalten Sie HTTP-Statuscode. Es sind spezifische Codebeispiele erforderlich. Vorwort: Bei der Webentwicklung ist häufig die Dateninteraktion mit dem Server erforderlich. Bei der Kommunikation mit dem Server müssen wir häufig den zurückgegebenen HTTP-Statuscode abrufen, um festzustellen, ob der Vorgang erfolgreich ist, und die entsprechende Verarbeitung basierend auf verschiedenen Statuscodes durchführen. In diesem Artikel erfahren Sie, wie Sie mit JavaScript HTTP-Statuscodes abrufen und einige praktische Codebeispiele bereitstellen. Verwenden von XMLHttpRequest

Lösen Sie das durch Schließungen verursachte Speicherverlustproblem Lösen Sie das durch Schließungen verursachte Speicherverlustproblem Feb 18, 2024 pm 03:20 PM

Titel: Durch Abschlüsse und Lösungen verursachte Speicherlecks Einführung: Abschlüsse sind ein sehr verbreitetes Konzept in JavaScript, das internen Funktionen den Zugriff auf Variablen externer Funktionen ermöglicht. Allerdings können Schließungen bei falscher Verwendung zu Speicherverlusten führen. In diesem Artikel wird das durch Schließungen verursachte Speicherverlustproblem untersucht und Lösungen sowie spezifische Codebeispiele bereitgestellt. 1. Durch Schließungen verursachte Speicherlecks Das Merkmal von Schließungen besteht darin, dass interne Funktionen auf Variablen externer Funktionen zugreifen können, was bedeutet, dass in Schließungen referenzierte Variablen nicht durch Müll gesammelt werden. Bei unsachgemäßer Verwendung

Wie erkennt man Speicherlecks mit Valgrind? Wie erkennt man Speicherlecks mit Valgrind? Jun 05, 2024 am 11:53 AM

Valgrind erkennt Speicherlecks und Fehler, indem es die Speicherzuweisung und -freigabe simuliert. Um es zu verwenden, befolgen Sie diese Schritte: Installieren Sie Valgrind: Laden Sie die Version für Ihr Betriebssystem von der offiziellen Website herunter und installieren Sie sie. Kompilieren Sie das Programm: Kompilieren Sie das Programm mit Valgrind-Flags (z. B. gcc-g-omyprogrammyprogram.c-lstdc++). Analysieren Sie das Programm: Verwenden Sie den Befehl valgrind--leak-check=fullmyprogram, um das kompilierte Programm zu analysieren. Überprüfen Sie die Ausgabe: Valgrind generiert nach der Programmausführung einen Bericht, der Speicherlecks und Fehlermeldungen anzeigt.

Wie vermeidet man Speicherlecks bei der technischen Leistungsoptimierung von Golang? Wie vermeidet man Speicherlecks bei der technischen Leistungsoptimierung von Golang? Jun 04, 2024 pm 12:27 PM

Speicherlecks können dazu führen, dass der Speicher des Go-Programms kontinuierlich zunimmt, indem: Ressourcen geschlossen werden, die nicht mehr verwendet werden, wie z. B. Dateien, Netzwerkverbindungen und Datenbankverbindungen. Verwenden Sie schwache Referenzen, um Speicherlecks zu verhindern, und zielen Sie auf Objekte für die Garbage Collection ab, wenn sie nicht mehr stark referenziert sind. Bei Verwendung von Go-Coroutine wird der Speicher des Coroutine-Stapels beim Beenden automatisch freigegeben, um Speicherverluste zu vermeiden.

Debugging-Techniken für Speicherlecks in C++ Debugging-Techniken für Speicherlecks in C++ Jun 05, 2024 pm 10:19 PM

Ein Speicherverlust in C++ bedeutet, dass das Programm Speicher zuweist, aber vergisst, ihn freizugeben, wodurch der Speicher nicht wiederverwendet wird. Zu den Debugging-Techniken gehören die Verwendung von Debuggern (wie Valgrind, GDB), das Einfügen von Assertionen und die Verwendung von Bibliotheken zur Erkennung von Speicherlecks (wie Boost.LeakDetector, MemorySanitizer). Es demonstriert die Verwendung von Valgrind zur Erkennung von Speicherlecks anhand praktischer Fälle und schlägt Best Practices zur Vermeidung von Speicherlecks vor, darunter: Immer zugewiesenen Speicher freigeben, intelligente Zeiger verwenden, Speicherverwaltungsbibliotheken verwenden und regelmäßige Speicherprüfungen durchführen.

Wie kann man Speicherlecks in Abschlüssen effektiv vermeiden? Wie kann man Speicherlecks in Abschlüssen effektiv vermeiden? Jan 13, 2024 pm 12:46 PM

Wie kann man Speicherlecks in Schließungen verhindern? Der Verschluss ist eine der leistungsstärksten Funktionen in JavaScript, die die Verschachtelung von Funktionen und die Kapselung von Daten ermöglicht. Schließungen sind jedoch auch anfällig für Speicherverluste, insbesondere bei asynchronen und Timer-Operationen. In diesem Artikel wird erläutert, wie Speicherlecks bei Abschlüssen verhindert werden, und es werden spezifische Codebeispiele bereitgestellt. Speicherlecks treten normalerweise auf, wenn ein Objekt nicht mehr benötigt wird, der von ihm belegte Speicher jedoch aus irgendeinem Grund nicht freigegeben werden kann. In einem Abschluss, wenn eine Funktion auf externe Variablen und diese Variablen verweist

So erhalten Sie auf einfache Weise HTTP-Statuscode in JavaScript So erhalten Sie auf einfache Weise HTTP-Statuscode in JavaScript Jan 05, 2024 pm 01:37 PM

Einführung in die Methode zum Abrufen des HTTP-Statuscodes in JavaScript: Bei der Front-End-Entwicklung müssen wir uns häufig mit der Interaktion mit der Back-End-Schnittstelle befassen, und der HTTP-Statuscode ist ein sehr wichtiger Teil davon. Das Verstehen und Abrufen von HTTP-Statuscodes hilft uns, die von der Schnittstelle zurückgegebenen Daten besser zu verarbeiten. In diesem Artikel wird erläutert, wie Sie mithilfe von JavaScript HTTP-Statuscodes erhalten, und es werden spezifische Codebeispiele bereitgestellt. 1. Was ist ein HTTP-Statuscode? HTTP-Statuscode bedeutet, dass der Dienst den Dienst anfordert, wenn er eine Anfrage an den Server initiiert

See all articles