JavaScript をよく使用する人は、そのガベージ コレクション メカニズムについて考えるでしょう。JavaScript では、開発者が C や C のようにガベージを手動でクリアする必要はありません。開発者は、JavaScript プログラムを作成する際に、メモリ使用量や必要なメモリ割り当てなどについて心配する必要はありません。不要なメモリ(ゴミ)のリサイクルは完全に自動で管理されます。根本的な原因は、プログラムが使用されなくなった変数を収集し、変数が占有しているメモリを解放することです。したがって、ガベージ コレクション メカニズムは、この操作を一定の間隔で定期的に繰り返し実行します。
たとえば、ローカル変数は関数内にのみ存在します。プログラムは、関数が終了すると、ローカル変数に対応する記憶領域をスタック メモリまたはヒープ メモリに割り当てます。必要に応じて、プログラムはローカル変数が占有しているメモリを解放し、他の変数が使用できるようにします。これはプログラムがメモリを解放する最も簡単な方法ですが、多くの場合、プログラム内の変数は常に使用されます。このとき、ガベージ コレクション メカニズムは変数を追跡し、その変数が使用されているかどうか、およびその変数のメモリ領域を判断する必要があります。解放することができます。
ガベージコレクション機構は主にマークアンドクリア方式と参照カウント方式の2つの方法で変数を判定してメモリ空間を解放します。
表記では、各変数には独自の実行環境があり、変数が作成されると、その変数は特定の環境で実行されます。たとえば、ローカル変数を作成すると、そのローカル変数が関数本体で実行されます。関数が実行されているとき、ローカル変数は「環境に入る」としてマークされます。関数本体が終了すると、変数はその実行環境から離れることを意味します。 。 「環境から離れる」変数の場合、ガベージ コレクション メカニズムはそれらを適宜記録し、次の収集サイクルで解放します。
各値が参照された回数を追跡する参照カウント方式。変数を宣言し、その変数に参照型の値を割り当てると、その値の参照カウントは 1 になります。同じ値が別の変数に代入されている場合、その値の参照カウントは 1 増加します。逆に、この値への参照を含む変数が別の値をとる場合、その値の参照カウントは 1 つ減ります。この値への参照の数が 0 の場合、この値にアクセスする方法がなくなったことを意味するため、この値が占有しているメモリ領域はリサイクルできます。次のサイクルでガベージ コレクターが実行されると、参照カウントがゼロの値が占有していたメモリ空間が解放されます。 (原文解説参考:Javascript Advanced Programming - Second Edition)
例: