Heim  >  Artikel  >  Web-Frontend  >  Über zB Speicherlecks und Javascript-Speicherfreigabe

Über zB Speicherlecks und Javascript-Speicherfreigabe

黄舟
黄舟Original
2016-12-14 15:58:28864Durchsuche

Vor Kurzem arbeite ich am Geschäftssystem eines Unternehmens. Das Unternehmen verlangt, dass es so nah wie möglich an c/s ist, das heißt, genau wie c/s, klicken Sie auf das Textfeld, um den relevanten Inhalt anzuzeigen Projekt zur Auswahl und Eingabe.
Ich habe ein Popup-Fenster verwendet, dann im untergeordneten Fenster auf das ausgewählte Element doppelgeklickt und den ausgewählten Wert an das übergeordnete Formular zurückgegeben.
Nachdem das System während der Nutzung durch den Kunden fertiggestellt ist, erreicht der IE nach dem Öffnen von 30 bis 40 Formularen eine Speicherkonfiguration von 512 MB und erreicht damit fast 200 MB, was zu einer Verlangsamung des Systems und der Ausführung führt von Javascript wird auch langsamer.

Nach einer Suche bei Google habe ich herausgefunden, dass die Ursache möglicherweise ein Speicherverlust im IE ist. Einzelheiten finden Sie in den entsprechenden Artikeln unter www.cnblogs.com.

Ich benutze den Task-Manager und öffne ein Popup-Fenster, und der IE-Speicher erhöht sich um 1-3 m, und dann schließe ich das Fenster. Manchmal wird der Speicher nicht freigegeben, manchmal wird er nur für freigegeben Dutzende Kilobyte. Es scheint, dass das Problem in der Speicherfreigabe liegt.

Suchen und finden Sie dann gemäß der Idee der Speicherfreigabe Methoden zur Lösung dieses Problems. Ich habe eine unbekannte JavaScript-Funktion CollectGarbage gefunden, die zum Freigeben von Speicher verwendet wird. Ich setze alle selbstdefinierten Javasctip-Variablen auf Null, bevor alle Popup-Fenster enden, und rufe die CollectGarbage-Funktion auf.

Wenn Sie eine Variable in Javascript auf Null setzen, gibt Javascript den Speicher nicht frei. Wenn die Variable das nächste Mal erneut definiert wird, wird der Speicher, in dem sich die Variable befindet, überschrieben. Wenn es nicht auf Null gesetzt ist, öffnet JavaScript beim erneuten Definieren der Variablen einen neuen Speicherplatz.

Wenn Sie nach der oben beschriebenen Verarbeitung das Fenster erneut öffnen, erhöht sich der Speicher des IE jedes Mal um 1–3 MB. Nach dem Schließen des Fensters gibt der IE jedoch eine bestimmte Speichermenge im Bereich von 500 KB frei bis 2m. spielte eine gewisse Rolle.
Da ich auf der Seite ein Drittanbieter-Steuerelement verwende, unterliegt die Verwaltung des Speichers im JavaScript im Drittanbieter-Steuerelement nicht meiner Kontrolle.
 


1. Beispiel für eine Javascript-Speicherfreigabemethode


Setzen Sie die Parameter aller übergeordneten Funktionen auf Null und verwenden Sie CollectGarbage, um Speicher freizugeben.

Beispiel
& lt; script & gt; ;
> for(var i=3;i<24;i++)
str+=str;
return str;
a= null;
return r()
{
}
var f=A(AllocMem()); 1);
CollectGarbage();
//Offensichtlich wurde es veröffentlicht.
r=null;
warning(2);
CollectGarbage();

.
(Jede Menüebene weist ?M Speicher zu. Sie können die Situation nur sehen, wenn Sie den Task-Manager betrachten.)


Hinweis:
CollectGarbage() gibt normalerweise Speicher im Kern frei Es wird nur aufgerufen, wenn das IE- oder NS-Programm endet. Dies ist sicher



Hinweis:
1) Wenn Sie die Referenz des Objekts im Fenster in einem anderen Fenster behalten, wird der Speicher auch dann nicht freigegeben, wenn Sie das Fenster schließen

Wie Sie vielleicht sehen Beachten Sie, dass mit window.open() geöffnete Fenster möglicherweise einen Prozess mit ihrem Öffner teilen (_blank oder _new window möglicherweise nicht, selbst wenn Sie diese beiden Fenster auf dem Desktop sehen, wenn Sie sich die Prozesstabelle in der Aufgabe ansehen). Manager, möglicherweise wird nur eine IEXPLORE.EXE ausgeführt. Der Speicher wird möglicherweise nur freigegeben, wenn der Prozess beendet wird

2) Was noch schlimmer ist: Wenn Sie einen Verweis auf ein DOM-Objekt behalten, schließen Sie das Fenster, in dem sich das Objekt befindet gefunden, stürzt der IE ab, meldet einen Speicherfehler (oder erfordert einen Neustart)

Ich würde sagen, das sieht nach einem Fehler aus, den Sie vielleicht an Microsoft melden möchten

Weitere verwandte Artikel finden Sie bitte Achten Sie auf PHP Chinese Net (www.php.cn)!


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