1. ホーム
  2. ジャバスクリプト

[解決済み】JavaScriptのガベージコレクションとは何ですか?

2022-03-29 16:31:48

質問

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

どのように解決するのですか?

Eric Lippert は 詳細なブログ記事 このテーマについて、少し前に(さらに、このテーマと比較するために VBScript ). より正確には、彼が書いたのは JScript これは、マイクロソフトが独自に実装した ECMAScript であり、JavaScript と非常によく似ています。Internet ExplorerのJavaScriptエンジンでも、大半の動作は同じだと考えてよいと思います。もちろん、ブラウザによって実装は異なりますが、共通する原則のいくつかを取り出して、他のブラウザに適用することは可能だと思います。

そのページより引用。

<ブロッククオート

JScriptは世代交代しない マーク・アンド・スイープ・ガベージコレクタです。 これは はこのように動作します。

  • スコープ内にあるすべての変数。 をスカベンジャーと呼びます。 スカベンジャーは は、数値、オブジェクト、あるいは 文字列でも何でも。 私たちは、リスト 変数が移動されます。 を使用します。 スコープに入ったとき、そしてスコープから外れたとき スコープの外に出る。

  • 時折、ガベージ コレクターが実行されます。 まず マークが表示されます。 文字列など、追跡されたすべてのメモリ GCによって (JScriptはVARIANT データ構造があり には未使用の余分なビットがたくさんあります。 そのため、そのうちの1つを設定するだけです。 を追加しました)。

  • 2つ目は、マークをクリアすることで スカベンジャーと推移的閉包 スカベンジャーリファレンスの ですから、もし スカベンジャーオブジェクトは 非スカベンジャーオブジェクトをクリアします。 ビットは、ノンスキャベンジャーと、ノンスキャベンジャーの を参照しているものすべて。 (私は クロージャという言葉を使っています。 先程とは違う意味で 投稿)

  • この時点で、すべての マークされたメモリは、割り当てられた メモリに到達することはできません。 は、スコープ内のどの変数からのパスであっても すべての これらのオブジェクトは を破壊する。 循環参照

ガベージコレクションの主な目的は、プログラマが次のことを可能にすることです。 ない もちろん、ガベージコレクションを避けて通ることはできませんが、ガベージコレクションがどのように機能するかについて、少なくとも大まかな知識を持っておくことは常に有益なことです。

歴史的なメモ への言及が誤っていました。 delete 演算子を使用します。JavaScriptでは その delete 演算子は、オブジェクトからプロパティを削除します。 とは全く別のものです。 delete C/C++でいうところの