Heim  >  Artikel  >  Web-Frontend  >  Was ist ein Speicherverlust und wie kann man ihn beheben?

Was ist ein Speicherverlust und wie kann man ihn beheben?

清浅
清浅Original
2019-03-16 11:49:433952Durchsuche

Speicherverlust bedeutet, dass ein Speicherverlust bezeichnet wird, wenn ein Objekt ineffektiv ist und recycelt werden sollte, aber aufgrund der Referenz eines anderen Objekts darauf nicht recycelt werden kann und im Heap-Speicher verbleibt. Zu den häufigsten gehören unerwartete globale Variablen, DOM-Lecks und Zirkelverweise usw.

Was ist ein Speicherverlust und wie kann man ihn beheben?

[Empfohlene Kurse: JavaScript-Tutorial]

Speicherverlust

Speicherverlust bezieht sich im Allgemeinen darauf, dass ein Objekt keinen Nutzen hat und recycelt werden sollte. Ein anderes verwendetes Objekt kann aufgrund seiner Referenz nicht recycelt werden. Dieses Objekt, das nicht recycelt werden kann, bleibt im Heap-Speicher, was zu einem Speicherverlust führt.

Wenn ein Objekt nicht mehr benötigt wird recycelt wird, enthält ein anderes verwendetes Objekt einen Verweis darauf, was dazu führt, dass es nicht recycelt wird. Dies führt dazu, dass das Objekt, das recycelt werden sollte, nicht recycelt wird und im Heap-Speicher verbleibt, was zu einem Speicherverlust führt

Häufige Speicherlecks:

1. Unerwartete globale Variablen

Die Art und Weise, wie Js mit undefinierten Variablen umgeht: undefiniert Die Variable erstellt eine neue Variable in das globale Objekt Im Browser ist das globale Objekt window.

function foo(arg) { 
bar = "this is a hidden global variable"; //等同于window.bar="this is a hidden global variable"
this.bar2= "potential accidental global";//这里的this 指向了全局对象(window),
等同于window.bar2="potential accidental global"}

Lösung: Fügen Sie im JavaScript-Programm den strikten Modus „use strict“ hinzu und aktivieren Sie ihn, um die oben genannten Probleme effektiv zu vermeiden.

Hinweis: Globale Variablen, die zum vorübergehenden Speichern großer Datenmengen verwendet werden, müssen auf Null gesetzt oder neu zugewiesen werden, nachdem sichergestellt wurde, dass die Daten verarbeitet werden.

2. DOM-Leckage

Im Browser verwenden DOM und JS eine Rendering-Engine, während JS die v8-Engine verwendet Der JS-Betrieb von DOM verbraucht mehr Leistung. Um die DOM-Operationen zu reduzieren, verwenden wir Variablenreferenzen, um sie in der aktuellen Umgebung zwischenzuspeichern. Wenn Sie einige Lösch- oder Aktualisierungsvorgänge durchführen, vergessen Sie möglicherweise, das zwischengespeicherte DOM freizugeben, was zu einem Speicherverlust führt

Beispiel: Verweis auf unbereinigtes DOM-Element

var refA = document.getElementById('refA');
document.body.removeChild(refA); // #refA不能回收,因为存在变量refA对它的引用。
将其对#refA引用释放,但还是无法回收#refA。

Lösung : Set refA = null;

3. Vergessene Timer und Rückruffunktionen

var someResource = getData();
setInterval(function() {
    var node = document.getElementById('Node');
    if(node) {
        node.innerHTML = JSON.stringify(someResource));
    }
}, 1000);

Ein solcher Code kommt sehr häufig vor, wenn das Element mit der ID Node aus dem DOM entfernt wird Da die Rückruffunktion einen Verweis auf someResource enthält, wird der Timer gleichzeitig nicht freigegeben

4. Zirkelverweis

Wenn Objekt A in der Speicherverwaltungsumgebung von js die Berechtigung zum Zugriff auf Objekt B hat, wird es als Objekt A bezeichnet, das auf Objekt B verweist. Die Referenzzählstrategie besteht darin, festzustellen, ob andere Objekte auf das Objekt verweisen. Wenn kein Objekt auf das Objekt verweist, wird das Objekt recycelt.

var obj1 = { a: 1 }; // 一个对象(称之为 A)被创建,赋值给 obj1,A 的引用个数为 1  
var obj2 = obj1; // A 的引用个数变为 2  
 obj1 = 0; // A 的引用个数变为 1 
 obj2 = 0; // A 的引用个数变为 0,此时对象 A 就可以被垃圾回收了

Aber das größte Problem bei der Referenzzählung sind Zirkelverweise.

function func() {  
    var obj1 = {};  
    var obj2 = {};  
    obj1.a = obj2; // obj1 引用 obj2  
    obj2.a = obj1; // obj2 引用 obj1  }

Wenn die Funktion ausgeführt wird, ist der Rückgabewert undefiniert, daher sollten die gesamte Funktion und die internen Variablen recycelt werden. Gemäß der Referenzzählmethode ist die Anzahl der Referenzen von obj1 und obj2 jedoch nicht 0 Sie werden also nicht recycelt. Um dieses Problem zu lösen, können Sie ihre Werte auf Null setzen

Zusammenfassung: Das Obige ist der gesamte Inhalt dieses Artikels, ich hoffe, er wird für alle hilfreich sein.

Das obige ist der detaillierte Inhalt vonWas ist ein Speicherverlust und wie kann man ihn beheben?. 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