blog

JSのゴミ収集メカニズムについて

ローカル変数は、関数が呼び出された後は、二度と使われないのでゴミになります。関数が再度呼び出されたとしても、使用される変数は元の変数と同じではありません。 マーカーの消去アルゴリズム:グローバルスコー...

Jun 26, 2020 · 2 min. read

ゴミとは

  • 不要になったものはゴミ
    • グローバル変数はどれもゴミではありません。
    • グローバル変数 = null の場合、元のオブジェクトはゴミになります。
    • ローカル変数は、この関数が呼び出された後はゴミとなります。この関数が再度呼び出されたとしても、使用される変数は元の変数とは異なります。
      • 例えば
        function c() {
         var foo = 0x1;
         console.log(foo);
        }
        c();
  • 二重参照がある場合
    • 片方の参照を削除してもオブジェクトは存在します。
    • のように:
var obj = { 'name': 'xxx' };
var foo = obj;
obj = null;
  • 指輪の名前だったら?
    • というように:
    • 父親を参照する変数がすべて緩んでしまったら、父親オブジェクトはゴミになります。
    • 父と母の間のファミリーリンクが取り除かれたら、父と母のオブジェクトもゴミになります。

ゴミ収集アルゴリズムについて

  1. マーカー消去アルゴリズム:グローバル・スコープから開始し、使用されているすべての変数をマークします。マークされた変数から参照されている他の変数があれば、それらを再度マークします。その後、マークされていない他のオブジェクトをすべてクリアします。

    • イラスト
    • タグ付けアルゴリズムの欠点:JSはシングルスレッドなので、オブジェクトが多すぎるとJSのロードに時間がかかりすぎます。
    • 改良点:世代リサイクル、バッチトラバーサル、アイドルタイムリサイクル
  2. 参照カウント・アルゴリズム:基本的に、各値が参照された回数を記録します。実装メカニズムは以下の通り:

    • 変数が宣言され、参照型の値が代入されると、その値は1回参照されます;
    • 同じ値が別の変数に代入された場合、その値の参照数は1加算されます;
    • ただし、この値への参照を含む変数が別の値を取得した場合、この値への参照の数は1つ減ります;
    • この値への参照数が0になると、その値へのアクセスはできなくなり、その値が占有していたメモリ領域は解放されます。
  3. その他のアルゴリズムは以下の通り:

  • 代替リサイクル
  • スカベンジアルゴリズム
  • マーキング・クランチング・アルゴリズム
  • ...
  • このようなアルゴリズムは、当面はあまりよく理解されていませんが、その後、研究が深まるにつれて、徐々に理解が深まっていくと思います。
Read next