ゴミとは
- 不要になったものはゴミ
- グローバル変数はどれもゴミではありません。
- グローバル変数 = null の場合、元のオブジェクトはゴミになります。
- ローカル変数は、この関数が呼び出された後はゴミとなります。この関数が再度呼び出されたとしても、使用される変数は元の変数とは異なります。
- 例えば
function c() { var foo = 0x1; console.log(foo); } c();
- 例えば
- 二重参照がある場合
- 片方の参照を削除してもオブジェクトは存在します。
- のように:
var obj = { 'name': 'xxx' };
var foo = obj;
obj = null;
- 指輪の名前だったら?
- というように:
- 父親を参照する変数がすべて緩んでしまったら、父親オブジェクトはゴミになります。
- 父と母の間のファミリーリンクが取り除かれたら、父と母のオブジェクトもゴミになります。
- というように:
ゴミ収集アルゴリズムについて
マーカー消去アルゴリズム:グローバル・スコープから開始し、使用されているすべての変数をマークします。マークされた変数から参照されている他の変数があれば、それらを再度マークします。その後、マークされていない他のオブジェクトをすべてクリアします。
- イラスト
- タグ付けアルゴリズムの欠点:JSはシングルスレッドなので、オブジェクトが多すぎるとJSのロードに時間がかかりすぎます。
- 改良点:世代リサイクル、バッチトラバーサル、アイドルタイムリサイクル
- イラスト
参照カウント・アルゴリズム:基本的に、各値が参照された回数を記録します。実装メカニズムは以下の通り:
- 変数が宣言され、参照型の値が代入されると、その値は1回参照されます;
- 同じ値が別の変数に代入された場合、その値の参照数は1加算されます;
- ただし、この値への参照を含む変数が別の値を取得した場合、この値への参照の数は1つ減ります;
- この値への参照数が0になると、その値へのアクセスはできなくなり、その値が占有していたメモリ領域は解放されます。
その他のアルゴリズムは以下の通り:
- 代替リサイクル
- スカベンジアルゴリズム
- マーキング・クランチング・アルゴリズム
- ...
- このようなアルゴリズムは、当面はあまりよく理解されていませんが、その後、研究が深まるにつれて、徐々に理解が深まっていくと思います。