ホームページ >ウェブフロントエンド >jsチュートリアル >Javascriptのガベージコレクションの仕組みの紹介と理解_基礎知識

Javascriptのガベージコレクションの仕組みの紹介と理解_基礎知識

WBOY
WBOYオリジナル
2016-05-16 17:33:49810ブラウズ

JavaScript をよく使用する人は、そのガベージ コレクション メカニズムについて考えるでしょう。JavaScript では、開発者が C や C のようにガベージを手動でクリアする必要はありません。開発者は、JavaScript プログラムを作成する際に、メモリ使用量や必要なメモリ割り当てなどについて心配する必要はありません。不要なメモリ(ゴミ)のリサイクルは完全に自動で管理されます。根本的な原因は、プログラムが使用されなくなった変数を収集し、変数が占有しているメモリを解放することです。したがって、ガベージ コレクション メカニズムは、この操作を一定の間隔で定期的に繰り返し実行します。


たとえば、ローカル変数は関数内にのみ存在します。プログラムは、関数が終了すると、ローカル変数に対応する記憶領域をスタック メモリまたはヒープ メモリに割り当てます。必要に応じて、プログラムはローカル変数が占有しているメモリを解放し、他の変数が使用できるようにします。これはプログラムがメモリを解放する最も簡単な方法ですが、多くの場合、プログラム内の変数は常に使用されます。このとき、ガベージ コレクション メカニズムは変数を追跡し、その変数が使用されているかどうか、およびその変数のメモリ領域を判断する必要があります。解放することができます。

ガベージコレクション機構は主にマークアンドクリア方式と参照カウント方式の2つの方法で変数を判定してメモリ空間を解放します。

表記では、各変数には独自の実行環境があり、変数が作成されると、その変数は特定の環境で実行されます。たとえば、ローカル変数を作成すると、そのローカル変数が関数本体で実行されます。関数が実行されているとき、ローカル変数は「環境に入る」としてマークされます。関数本体が終了すると、変数はその実行環境から離れることを意味します。 。 「環境から離れる」変数の場合、ガベージ コレクション メカニズムはそれらを適宜記録し、次の収集サイクルで解放します。

各値が参照された回数を追跡する参照カウント方式。変数を宣言し、その変数に参照型の値を割り当てると、その値の参照カウントは 1 になります。同じ値が別の変数に代入されている場合、その値の参照カウントは 1 増加します。逆に、この値への参照を含む変数が別の値をとる場合、その値の参照カウントは 1 つ減ります。この値への参照の数が 0 の場合、この値にアクセスする方法がなくなったことを意味するため、この値が占有しているメモリ領域はリサイクルできます。次のサイクルでガベージ コレクターが実行されると、参照カウントがゼロの値が占有していたメモリ空間が解放されます。 (原文解説参考:Javascript Advanced Programming - Second Edition)

例:

コードをコピー コードはObject( ; 1
}


この関数が終了すると、object1 のカウンタ読み取り値は 1、object2 のカウンタ次数は 1 になります。したがって、両方の変数は破棄されません。このようなプログラムが関数本体内に多数存在すると、大量のメモリが無駄になり再利用できなくなり、メモリ リークが発生します。

上記の問題を解決するには、object1 object2 が占有しているメモリを手動で解放します。つまり、



コードをコピー


コードは次のとおりです。
object1.method1 = null; 2 .method2 = null; 上記の例と比較し、通常の状況での例を示します。


コードをコピー

コードは次のとおりです:

function countMethod(){
var object1 = new Object(); // Declare variable, counter changes from 0 to 1
var object2 = new Object(); // Declare variable, counter From 0 to 1
object1.method1 = "This is object1"; // object1 counter -1, object1 reading changes to 0
object2.method2 = "This is object2"; // object2 counter -1, The reading of object2 becomes 0
}

As can be seen from the above example, under normal circumstances, when the function ends, the reading of object1 and object2 is 0. In the next garbage collection cycle, it will is recycled and the memory it occupies is released.
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。