JSのガベージコレクション

メモリのライフサイクル

  • あなたは、メモリを割り当てる必要があります
  • 割り当てられた使用メモリ(読み取り、書き込み)
  • \リターンを解放するために必要としない場合

すべての言語は、透明第二の部分である。基礎となる言語の第一及び第三の部分は明らかであるが、「ガベージコレクション」に埋め込まれたJavaScript、などの高レベル言語で、ウィキの定義によれば、ガベージコレクションであります自動メモリ管理機構の種類は、未使用のメモリを追跡し、自動的に解除します。

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のオブジェクトはしていますそれはプロトタイプ(暗黙参照)属性とそれへの参照(明示的な参照)への参照します。

ここで、「オブジェクト」の概念は、関数のスコープ(グローバルまたはレキシカルスコープ)を含むJavaScriptオブジェクトに固有の、だけではありません。

変数

グローバル変数jsファイル内のローカル変数は(グローバル変数はグローバルオブジェクトであり、クライアントのjsグローバルオブジェクトは、現在のブラウザウィンドウでウィンドウを意味している)があります。

ブラウザのページ内のグローバル変数は常に存在である。ローカル変数は、その関数スコープの存在、自動的に現在のスコープを残して逆参照で作成され、解放されます。

参照カウントガーベジコレクション

これは、ガベージコレクションのアルゴリズムの最もジュニアではありません。このアルゴリズムは、定義された単純化するために、「オブジェクトが不要になった」さ「オブジェクトは、それには他のオブジェクト参照を持っていません。」のようなオブジェクト(ゼロ基準)への参照がない場合は、オブジェクトがガベージコレクションでありますリサイクル。

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つのオブジェクトが作成され、彼らは何の使用を持っていないので、彼らは関数のスコープと呼ばれた後、去るループを形成し、相互に参照してください。 、それを回収することができる。ただし、参照カウントアルゴリズムは、彼らが回収されないように、彼らはお互いに少なくとも一つの基準を持っていることを考慮に入れています。

function f(){
  var o = {};
  var o2 = {};
  o.a = o2; // o 引用 o2
  o2.a = o; // o2 引用 o

  return "azerty";
}

f();

クリアラベリングアルゴリズム

このアルゴリズムは、次のように定義簡素化するために、「オブジェクトが不要になった」ではない「オブジェクトを取得することができるかどうか。」

クリアラベリングマークとスイープアルゴリズムは、2つの段階に分けられる。このアルゴリズムは、セットがガベージコレクタが定期的にルートからすべての参照を見つけるために、ルートから開始します(JavaScriptで、根がグローバルオブジェクトである)。オブジェクトのルート(ルート)と呼ばれることを前提としていオブジェクトは、その後、オブジェクト参照、これらのオブジェクトは、これらのオブジェクトは......ルートから始まる、ガベージコレクタが使用可能なすべてのオブジェクトを検索して取得することができないすべてのオブジェクトを収集する印を見つける。クリアフェーズに入った後、オブジェクトをマークこれは、メモリ内のオブジェクトと比較して、マークされていないそれらのオブジェクトのメモリをクリアします

  • マーク・フェーズ、それはすべてのヒープ内のオブジェクト、およびマーク生き残ったオブジェクトを横断します。
  • ステージクリア、再利用するためのマークされていない空間オブジェクト。

このJavaScriptは、2012年からガベージコレクションの中で最も一般的な形で、すべての最新ブラウザは、マークを使用する - ガベージコレクションのメソッドをクリアするには、IEの低いバージョンでは、参照カウント方式を使用しています。

マーク照合アルゴリズム

マークコンパクト(タグを編成するために)、アルゴリズムのメモリの使用を改善する、明確なメモリフラグメンテーションにマークから生じる問題を解決するためである。修正タグクリア標識に基づいて整理し、マーキングと同じステージをクリアするための標識が、標識されていません異なるオブジェクトは、ステージが極端な緊縮財政なっクリアされます、アプローチ。クリアマークがすぐに回復し、オブジェクトを整理するためのタグは移動が完了した直後のボーダーを一掃、いくつかのために生きているメモリ領域に移動されますタグ付けされていませんメモリ離れた。引き締めプロセスが効率が非常に良いではありませんので、オブジェクトを移動する必要はなく、メモリの断片化が発生しないことを確実にするために。

ドキュメント

おすすめ

転載: www.cnblogs.com/mybilibili/p/11819148.html