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

JavaScriptのマークアンドスイープアルゴリズムについて詳しく説明してください。


マークアンドスイープアルゴリズム

マークアンドスイープアルゴリズムは、「不要になったオブジェクト」ではなく、「到達不能な」オブジェクトを探します。このアルゴリズムは、参照カウントアルゴリズムを改良したものです。

このアルゴリズムは、実際には3つの重要なステップを経ています。

  • ルート:一般に、ルートはコードで使用されるグローバル変数です。 javascriptのウィンドウオブジェクトはルートとして機能できます。このアルゴリズムは、グローバルオブジェクトルートを使用して、オブジェクトが到達可能か到達不能かを検出します。
  • このアルゴリズムは、すべてのルートとその子を監視します。監視中、提供された条件に基づいて、到達可能な一部のオブジェクトにマークが付けられ、到達できない残りのオブジェクトにはマークが付けられません。
  • マークされていない、つまり到達できないオブジェクトはガベージコレクションされます。

マークフェーズ

マークフェーズでは、マークされている要素とマークされていない要素を見つけることができます。与えられた例-1に示すように、プロパティ'hello'をオブジェクト'obj1'に割り当てたとしましょう。このアルゴリズムで使用されるルートのグローバルオブジェクトは、obj1とそのプロパティ「hello」に到達できます。だから今マークされています。

例-1

var obj1 = {
pro1: "hello" // marked because it can be reached by root.
}

例2に示すように、このオブジェクトにnull値を割り当てたとします。次に、新しく割り当てられた「null」がマークされ、以前に割り当てられた「propertyhello」のマークが解除されます。したがって、マークフェーズの最後に、「null」が割り当てられたオブジェクトがマークされ、「propertyhello」が割り当てられたオブジェクトがマークされていないと結論付けることができます。

例-2

obj1 = null // null will be marked(reachable) and hello will be unmarked(unreachable)

スイープフェーズ

名前が示すように、到達不能なオブジェクトを「スイープ」します。マークフェーズでは、「property hello」のオブジェクトがマークされておらず、到達不能になっていることがわかりました。到達不能なオブジェクトはガベージコレクションされるため、「propertyhello」のオブジェクトはこのフェーズでガベージコレクションされます。

マークアンドスイープアルゴリズムは、プログラムから直接または間接的にアクセスできるオブジェクトのコレクション全体をトレースするため、トレースガベージコレクタとも呼ばれます。

サイクルはもう問題ではありません

次の例では、関数呼び出しが戻ったときに、2つのオブジェクトobj1とobj2は、ガベージコレクションの対象としてそこに到達できるものによって参照されていません。したがって、ガベージコレクタはオブジェクトobj1とobj2のメモリを解放します。

function f() {
   var obj1 = {};
   var obj2 = {};
   obj1.p = obj2; // obj1 references obj2
   obj2.p = obj1; // obj2 references obj1. This creates a cycle.
}
f();

制限

いつ、どのメモリを解放するかを手動で決定するのが非常に便利な場合があります。オブジェクトのメモリを解放するには、オブジェクトを明示的に到達不能にする必要があります。 JavaScriptでガベージコレクションを明示的にトリガーするこのプロセスは、現時点では不可能です。


  1. JavaScriptでサブオブジェクトと配列を持つオブジェクトをインポートする方法は?

    以下は、JavaScriptでサブオブジェクトと配列を含むオブジェクトをインポートするためのコードです- 例 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Document</title> &

  2. JavaScriptのオブジェクトの同等性を説明します。

    JavaScriptでは、文字列、数値、ブール値などのプリミティブはそれらの値によって比較され、オブジェクト(ネイティブまたはカスタム)はそれらの参照によって比較されます。参照による比較とは、2つ以上のオブジェクトがメモリ内の同じ場所を指しているかどうかを意味します。 以下は、JavaScriptのオブジェクトの同等性を説明するコードです- 例 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name=&q