JavaScript ガベージコレクションとは何ですか? 質問する

JavaScript ガベージコレクションとは何ですか? 質問する

JavaScript ガベージ コレクションとは何ですか? より良いコードを書くために、Web プログラマーが JavaScript ガベージ コレクションについて理解しておくべき重要なことは何ですか?

ベストアンサー1

エリック・リッパートは詳細なブログ投稿少し前にこの件について(さらにVBScriptとの比較も含めて)書いています。より正確には、JScriptこれは Microsoft 独自の ECMAScript 実装ですが、JavaScript と非常によく似ています。Internet Explorer の JavaScript エンジンでも、動作の大部分は同じであると想定できると思います。もちろん、実装はブラウザーごとに異なりますが、いくつかの共通原則を採用して他のブラウザーに適用できると思います。

そのページから引用:

JScript は、非世代的なマーク アンド スイープ ガベージ コレクターを使用します。これは次のように動作します。

  • 「スコープ内」にあるすべての変数は「スカベンジャー」と呼ばれます。スカベンジャーは、数値、オブジェクト、文字列など、何でも参照できます。私たちはスカベンジャーのリストを管理しています。変数は、スコープ内に入ると scav リストに移動され、スコープ外になると scav リストから削除されます。

  • 時々、ガベージ コレクターが実行されます。まず、すべてのオブジェクト、変数、文字列など、GC によって追跡されるすべてのメモリに「マーク」を付けます。(JScript は内部で VARIANT データ構造を使用し、その構造には未使用の余分なビットが多数あるため、そのうちの 1 つを設定します。)

  • 2 番目に、スカベンジャーのマークとスカベンジャー参照の推移的閉包をクリアします。したがって、スカベンジャー オブジェクトが非スカベンジャー オブジェクトを参照する場合、非スカベンジャーのビットとそれが参照するすべてのビットをクリアします。(「閉包」という単語を以前の投稿とは異なる意味で使用しています。)

  • この時点で、まだマークされているすべてのメモリは、スコープ内のどの変数からもどのパスでもアクセスできない割り当て済みメモリであることがわかります。これらのオブジェクトはすべて、循環参照を破壊するように指示されます。

ガベージ コレクションの主な目的は、プログラマが作成して使用するオブジェクトのメモリ管理について心配しなくても済むようにすることですが、もちろん、メモリ管理は避けられないこともあります。ガベージ コレクションがどのように機能するかについて、少なくとも大まかな知識を持っていることは常に有益です。

歴史的注記:回答の以前の改訂版では、delete演算子への参照が間違っていました。JavaScriptでは演算子deleteはオブジェクトからプロパティを削除しますdelete、 C/C++とはまったく異なります。

おすすめ記事