Javascript
 Computer >> コンピューター >  >> プログラミング >> Javascript

JavaScriptのメモリリークについて詳しく説明してください。


JavaScriptでのメモリリーク

JavaScriptはガベージコレクション言語と呼ばれます。つまり、変数が宣言されると、自動的にメモリが割り当てられます。宣言された変数への参照がなくなると、割り当てられたメモリが解放されます。メモリリークまたはメモリ関連の問題のほとんどは、メモリの解放中に発生します。

いくつかの一般的なJavaScriptリーク

1)偶発的なグローバル変数

宣言されていない変数が参照されると、javascriptはグローバルオブジェクトに新しい変数を作成します。次の例1では、言語の目的が「myArray」関数の変数のみを参照することであるとしましょう。 varを使用して宣言しない場合、グローバル変数が作成されます。それほど害はないかもしれませんが、主な問題は、例2に示すような「this」キーワードを使用してグローバル変数が誤って作成された場合に発生します。

例-1

function myArray(arg) {
   languages = "[javascript,.....]";  //  created using window
}

例-2

function myArray(arg) {
   this.languages = "[javascript,.....]";  // global object  
}

グローバル変数のスコープは決して終了しないため、必要がなくてもページの実行中はメモリに残ります。このシナリオでは、変数スコープが終了すると動的メモリを削除するガベージコレクタが、メモリリーク(未使用)を作成します。メモリに残っているオブジェクト)。グローバル変数が多いほど、メモリリークが多くなります。

2)閉鎖

クロージャは、外部関数の変数(スコープ)にアクセスできる内部関数です。また、内部関数は、外部関数が実行された後も外部関数のスコープにアクセスし続けます。宣言された変数が内部のネストされた関数で自動的に使用可能になり、で参照されていないにもかかわらずメモリに存在する場合、メモリリークが発生します。内側の入れ子関数。

以下の例では、クロージャ内のすべての内部関数が同じコンテキストを共有しているため、innFun()は外部関数によって返される「function(){}」と同じコンテキストを共有します。これで、3ミリ秒ごとに、outFunへの関数呼び出しが行われ、(各呼び出しの後に)新しい値がグローバル変数newvalueに割り当てられます。参照がこの「function(){}」を指している限り、内部関数が呼び出されなくても、内部関数(innFun)の一部であるため、共有スコープが維持され、配列が保持されます。外部関数(outFun)を呼び出すたびに、前のfunction(){}を新しい関数のvalue(変数)に保存します。したがって、ここでも、以前に共有されたスコープを維持する必要があります。したがって、外部関数(outFun)のn番目の呼び出しでは、外部の(n-1)番目の呼び出しの配列をガベージコレクションできません。このプロセスは、メモリが最終的になくなると停止します。

var newvalue;
function outFun() {
   var array = new Array(1000000);
   var value = newvalue;
      function innFun() {
        if (value) return array;
   }
   return function () {};
}
setInterval(function () {
   newvalue = outFun();
   }, 3);

  1. JavaScriptの「コンストラクター関数ではない」エラーを説明しますか?

    コンストラクターではないコンストラクターとしてオブジェクトまたは変数を使用すると、コンストラクターではない関数エラーが発生します。 以下は、JavaScriptのコンストラクター関数エラーではないためのコードです- 例 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-sca

  2. JavaScriptでの関数の借用。

    call()、apply()、bind()は、JavaScriptのメソッドを借用するために使用されます。 以下は、JavaScriptでメソッドを借用するためのコードです- 例 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> &