jsゴミ回収
4055 ワード
メモリライフサイクルあなたが必要とするメモリ を割り当てます.割り当てられたメモリ(読み、書き)を使用する .必要でない時にリリースします. を返します.
すべての言語の第二部分は明確であり、第一及び第三部分は底の言語で明確であるが、JavaScriptのような高度な言語には「ゴミ回収器」が埋め込まれており、Wikiの定義によると、ゴミ回収は自動的なメモリ管理機構であり、不要なメモリを追跡して自動的に放出される.
JavaScriptのメモリ割り当て
値の初期化
いくつかの関数の呼び出しの結果は、割り当て対象メモリです.
値を使用するプロセスは、実際には割り当てられたメモリを読み込み、書き込みする動作です.変数またはオブジェクトの属性値を書き込み、さらには伝達関数のパラメータを読み取り、書き込みすることができます.
ごみの回収
プログラムはメモリの中で実行されます.変数を宣言し、関数を定義するとメモリを占有します.メモリの容量は限られています.変数、関数などが消滅していない過程を生むだけであれば、遅かれ早かれメモリは完全に占有されます.この時、自分のプログラムだけではなく、他のプログラムも影響を受けます.だから、コンピュータの中で、私達はごみの回収が必要です.注意したいのは、定義の中の「自動」という意味は言葉でメモリーゴミの回収を助けてくれますが、メモリ管理に関心がないという意味ではありません.
いくつかの変数が必要でないときは、javascriptはこれらの変数の占有メモリを解放します.「どの割り当てられたメモリがもう必要ではありません.」は実現しにくい任務です.基礎言語では、開発者にプログラムの中のメモリが必要でないことを確認してもらいます.一方、上級言語の解凍器には「ゴミ回収器」が埋め込まれています.その主な仕事はメモリの割り当てと使用を追跡することで、割り当てられたメモリが使われなくなった時、自動的にそれを釈放します.ゴミ回収の実現には制限があります.一般的な問題を解決するしかありません.
参照
ゴミ回収アルゴリズムは主に引用の概念に依存しています.メモリ管理の環境において、オブジェクトが別のオブジェクトにアクセスする権限(暗黙的または明示的)がある場合、オブジェクトとして別のオブジェクトを参照します.例えば、Javascriptオブジェクトはそのプロトタイプに対する参照(陰的参照)とその属性に対する参照(明示的参照)を持っています.
ここでは、「対象」の概念はJavaScriptオブジェクトを指すだけでなく、関数のスコープ(またはグローバルスコープ)も含む.
変数
jsにはグローバル変数のローカル変数があります.ここのグローバル変数はglobal ojectです.clientのjsのグローバルオブジェクトはwindowです.つまり、現在のブラウザウィンドウです.
グローバル変数はブラウザのページに常に存在します.ローカル変数は関数のスコープを作成する際に存在します.現在のスコープから離れると、自動的に参照を解除してリリースします.
ごみ収集の参照
これは最初のゴミ収集アルゴリズムです.このアルゴリズムは「対象が不要かどうか」を「対象が他のオブジェクトに引用されているかどうか」と簡略化して定義しています.この対象を参照していないと(ゼロ参照)、対象はゴミ回収メカニズムによって回収されます.
このアルゴリズムには、循環参照を処理できない事例があります.以下の例では、2つのオブジェクトが作成され、相互参照されて、1つのループが形成されています.それらが呼び出された後に関数のスコープから離れるので、それらはもう使われなくなり、回収されます.しかし、相互に少なくとも1回の参照があることを考慮して、それらは回収されません.
このアルゴリズムは、オブジェクトがもう必要でないかを、オブジェクトが獲得できるかどうかを簡略化して定義します.
マークアップアルゴリズムはマークアップとクリアの二つの段階に分けられています.このアルゴリズムはルートと呼ばれるオブジェクト(Javascriptではルートはグローバルオブジェクト)を設定すると仮定しています.ごみ箱は定期的にルートから始まり、ルートから参照するすべてのオブジェクトを探して、これらのオブジェクトを探してマークします.根から始まります.ゴミ回収器は、取得可能なすべてのオブジェクトを見つけ、収集できないすべてのオブジェクトを収集します.その後、クリア段階に入り、マークされたオブジェクトはメモリの中のオブジェクトと比較し、メモリの中にマークされていないオブジェクトを消去します.マーカー段階では、すべてのオブジェクトを巡回し、生存するオブジェクトをマーキングします. クリア段階において、マークされていないオブジェクトの空間を回収する. これはJavaScriptの中で最も一般的なごみの回収方法です.2012年から、すべての現代のブラウザでマーク-クリアされたゴミの回収方法を使用しています.
整理アルゴリズムをマーク
マークアップはマーククリアによるメモリチップの問題を解決するために、メモリの利用を向上させます.マークアップはマーククリアの基礎で修正します.マーク段階はマーククリアと同じですが、マークされていないオブジェクトの処理方式は違います.そのクリア段階を緊縮極に変更します.マーククリアはマークされていない対象をすぐに回収し、マーク整理は生きている対象をメモリエリアの一部に移動し、移動が完了したら直接に境界外のメモリを消去します.緊縮プロセスは対象の移動に関連しますので、効率はあまり良くないですが、メモリの破片が生成されないことが保証されます.
doc MDN 浅い話V 8エンジンの中のごみ回収の構造 JavaScriptのゴミ回収 javascriptごみ回収メカニズム
すべての言語の第二部分は明確であり、第一及び第三部分は底の言語で明確であるが、JavaScriptのような高度な言語には「ゴミ回収器」が埋め込まれており、Wikiの定義によると、ゴミ回収は自動的なメモリ管理機構であり、不要なメモリを追跡して自動的に放出される.
JavaScriptのメモリ割り当て
値の初期化
var n = 123; //
var s = "azerty"; //
var o = {
a: 1,
b: null
}; //
// ( )
var a = [1, null, "abra"];
function f(a){
return a + 2;
} // ( )
//
someElement.addEventListener('click', function(){
someElement.style.backgroundColor = 'blue';
}, false);
割り当てメモリを関数で呼び出します.いくつかの関数の呼び出しの結果は、割り当て対象メモリです.
var d = new Date(); // Date
var e = document.createElement('div'); // DOM
新しい変数または新しいオブジェクトを割り当てる方法があります.var s = "azerty";
var s2 = s.substr(0, 3); // s2
// ,
// JavaScript ,
// [0-3] .
var a = ["ouais ouais", "nan nan"];
var a2 = ["generation", "nan nan"];
var a3 = a.concat(a2);
// , a a2
値を使う値を使用するプロセスは、実際には割り当てられたメモリを読み込み、書き込みする動作です.変数またはオブジェクトの属性値を書き込み、さらには伝達関数のパラメータを読み取り、書き込みすることができます.
ごみの回収
プログラムはメモリの中で実行されます.変数を宣言し、関数を定義するとメモリを占有します.メモリの容量は限られています.変数、関数などが消滅していない過程を生むだけであれば、遅かれ早かれメモリは完全に占有されます.この時、自分のプログラムだけではなく、他のプログラムも影響を受けます.だから、コンピュータの中で、私達はごみの回収が必要です.注意したいのは、定義の中の「自動」という意味は言葉でメモリーゴミの回収を助けてくれますが、メモリ管理に関心がないという意味ではありません.
いくつかの変数が必要でないときは、javascriptはこれらの変数の占有メモリを解放します.「どの割り当てられたメモリがもう必要ではありません.」は実現しにくい任務です.基礎言語では、開発者にプログラムの中のメモリが必要でないことを確認してもらいます.一方、上級言語の解凍器には「ゴミ回収器」が埋め込まれています.その主な仕事はメモリの割り当てと使用を追跡することで、割り当てられたメモリが使われなくなった時、自動的にそれを釈放します.ゴミ回収の実現には制限があります.一般的な問題を解決するしかありません.
参照
ゴミ回収アルゴリズムは主に引用の概念に依存しています.メモリ管理の環境において、オブジェクトが別のオブジェクトにアクセスする権限(暗黙的または明示的)がある場合、オブジェクトとして別のオブジェクトを参照します.例えば、Javascriptオブジェクトはそのプロトタイプに対する参照(陰的参照)とその属性に対する参照(明示的参照)を持っています.
ここでは、「対象」の概念はJavaScriptオブジェクトを指すだけでなく、関数のスコープ(またはグローバルスコープ)も含む.
変数
jsにはグローバル変数のローカル変数があります.ここのグローバル変数はglobal ojectです.clientのjsのグローバルオブジェクトはwindowです.つまり、現在のブラウザウィンドウです.
グローバル変数はブラウザのページに常に存在します.ローカル変数は関数のスコープを作成する際に存在します.現在のスコープから離れると、自動的に参照を解除してリリースします.
ごみ収集の参照
これは最初のゴミ収集アルゴリズムです.このアルゴリズムは「対象が不要かどうか」を「対象が他のオブジェクトに引用されているかどうか」と簡略化して定義しています.この対象を参照していないと(ゼロ参照)、対象はゴミ回収メカニズムによって回収されます.
var o = {
a: {
b:2
}
};
// , , o
// ,
var o2 = o; // o2 “ ”
o = 1; // ,“ ” o o2
var oa = o2.a; // “ ” a
// ,“ ” , o2, oa
o2 = "yo"; //
//
// a oa ,
oa = null; // a
//
制限:循環参照このアルゴリズムには、循環参照を処理できない事例があります.以下の例では、2つのオブジェクトが作成され、相互参照されて、1つのループが形成されています.それらが呼び出された後に関数のスコープから離れるので、それらはもう使われなくなり、回収されます.しかし、相互に少なくとも1回の参照があることを考慮して、それらは回収されません.
function f(){
var o = {};
var o2 = {};
o.a = o2; // o o2
o2.a = o; // o2 o
return "azerty";
}
f();
マーククリアアルゴリズムこのアルゴリズムは、オブジェクトがもう必要でないかを、オブジェクトが獲得できるかどうかを簡略化して定義します.
マークアップアルゴリズムはマークアップとクリアの二つの段階に分けられています.このアルゴリズムはルートと呼ばれるオブジェクト(Javascriptではルートはグローバルオブジェクト)を設定すると仮定しています.ごみ箱は定期的にルートから始まり、ルートから参照するすべてのオブジェクトを探して、これらのオブジェクトを探してマークします.根から始まります.ゴミ回収器は、取得可能なすべてのオブジェクトを見つけ、収集できないすべてのオブジェクトを収集します.その後、クリア段階に入り、マークされたオブジェクトはメモリの中のオブジェクトと比較し、メモリの中にマークされていないオブジェクトを消去します.
整理アルゴリズムをマーク
マークアップはマーククリアによるメモリチップの問題を解決するために、メモリの利用を向上させます.マークアップはマーククリアの基礎で修正します.マーク段階はマーククリアと同じですが、マークされていないオブジェクトの処理方式は違います.そのクリア段階を緊縮極に変更します.マーククリアはマークされていない対象をすぐに回収し、マーク整理は生きている対象をメモリエリアの一部に移動し、移動が完了したら直接に境界外のメモリを消去します.緊縮プロセスは対象の移動に関連しますので、効率はあまり良くないですが、メモリの破片が生成されないことが保証されます.
doc