これは特定のガベージ コレクターに依存する可能性があるため、答えは使用している JavaScript エンジンによって異なります。
最初に、最良のアプリケーション コードは 2 つのことを行うことに注意してください。機能とパフォーマンスの技術的目標を達成し、変化に対する回復力があります。追加のコードは、追加された複雑さを正当化するのに十分な目的を果たす必要があります。
そうは言っても、Chrome で使用される JavaScript エンジンであるV8 に関する Google のメモによると、
V8 は、ガベージ コレクションと呼ばれるプロセスで不要になったオブジェクトによって使用されたメモリを再利用します。高速なオブジェクトの割り当て、短いガベージ コレクションの一時停止、およびメモリの断片化がないことを保証するために、V8 は、世代別の正確なガベージ コレクタを採用しています。これは、V8 が次のことを意味します。
- ガベージ コレクション サイクルの実行時にプログラムの実行を停止します。
- ほとんどのガベージ コレクション サイクルで、オブジェクト ヒープの一部のみを処理します。これにより、アプリケーションの停止による影響が最小限に抑えられます。
- すべてのオブジェクトとポインタがメモリ内のどこにあるかを常に正確に認識しています。これにより、メモリ リークの原因となる可能性がある、オブジェクトをポインターとして誤って識別することが回避されます。
V8 では、オブジェクト ヒープは 2 つの部分に分割されます。オブジェクトが作成される新しいスペースと、ガベージ コレクション サイクルを生き残ったオブジェクトがプロモートされる古いスペースです。オブジェクトがガベージ コレクション サイクルで移動されると、V8 はそのオブジェクトへのすべてのポインターを更新します。
世代別ガベージ コレクターは、ヒープ間でオブジェクトを移動する傾向があり、すべてのライブ オブジェクトが宛先ヒープに移動されます。宛先に移動されていないものはすべてガベージと見なされます。V8 ガベージ コレクターがライブ オブジェクトをどのように識別するかは明確ではありませんが、手がかりとして他の GC 実装を調べることができます。
十分に文書化された GC 実装の動作の例として、Java の Concurrent Mark-Sweep コレクター:
- アプリケーションを停止します。
- アプリケーション コードから到達可能なオブジェクトのリストを作成します。
- アプリケーションを再開します。並行して、CMS コレクターは「マーク」フェーズを実行します。このフェーズでは、推移的に到達可能なオブジェクトを「ガベージではない」としてマークします。これはプログラムの実行と並行しているため、アプリケーションによって行われた参照の変更も追跡します。
- アプリケーションを停止します。
- 2 番目の (「リマーク」) フェーズを実行して、新しく到達可能なオブジェクトをマークします。
- アプリケーションを再開します。並行して、ガベージとして識別されたすべてのオブジェクトを「一掃」し、ヒープ ブロックを再利用します。
これは基本的に、特定のノードのセットから始まるグラフ トラバーサルです。切断されたオブジェクトにはアクセスできないため、他の切断されたオブジェクトへの接続性は機能しません。
http://www.oracle.com/technetwork/java/javase/memorymanagement-whitepaper-150215.pdfには、Java ガベージ コレクションの仕組みに関するホワイト ペーパーがあります。ガベージ コレクションは Java に固有のものではないため、Java 仮想マシンと JavaScript エンジンなどの他のランタイムが採用するさまざまなアプローチには類似点があるのではないかと思います。
Raymond Chen はブログ投稿を書き、解放しようとしている歩行記憶がパフォーマンスに悪影響を及ぼす可能性があることを指摘しました。コンテキストは、アプリケーションのシャットダウン時にメモリを手動で解放することでした。ブロックはディスクにスワップされている可能性があるため、参照をトラバースする行為により、それらのブロックがスワップインされる可能性があります。この場合、プログラムは、使用可能としてマークされ、そのまま放置されたブロックのトラバースを実行しています。
そのため、OS が一部のブロックをスワップ アウトした可能性がある状況では、ガベージ コレクターを「支援」する行為は、特に寿命の長いオブジェクトに対して、処理速度を低下させる可能性があります。
また、スワップアウトを心配するほど十分なデータが生成されていない場合、合理的なガベージ コレクターが気付くのに十分な時間はかかりません。
そのため、努力する価値はなく、逆効果になる可能性があります。ヒープ「ドミネーター」への参照を削除することはおそらく理にかなっていますが。これらは、収集された場合、他の多くのオブジェクトの収集を可能にするオブジェクトです。そのため、コレクション内の各項目ではなく、コレクション自体への参照を削除してください。